您的位置:首页 > 数据库 > Redis

NoSQL之Redis---事务(transaction)命令

2016-06-19 09:47 543 查看
[不忘初心]

相信学过数据库事务的看官一定知道ACID四原则,即事物的原子性(Atomic)、一致性(Consistent)、独立性(Isolated)及持久性(Durable)。但是在Redis的事务中,只保证了一致性,独立性。为什么这么讲呢?对于原子性,Redis事务在执行中遇到错误,不会回滚,而是继续执行后续的命令。对于持久性,redis的事务执行结果只保证结果存在于内存服务其中,真正的持久化需要额外的持久化模式来实现,该功能我们后续在进行介绍。现在,我们先来介绍一下Redis事务命令的基本用法,惯例,请各位看官准备好练习环境。

-----------------------------------------------------------------------------------------------------------------------------------

DISCARD





EXEC





MULTI



UNWATCH





WATCH key [key ...]





特别的:
1.事物执行之后,无论成功或者失败,WATCH命令都会失效。
2.关闭客户端也会导致WATCH命令失效。
------------------------------------------------------------------------------------------------------------------------------------

事务中的错误:

使用Redis事物时,可能会遇到如下的两种错误:
第一种:在执行EXEC之前,入队的命令可能会出错。出错的原因可能是,错误的命令语法(命令书写错误,参数数量错误,参数名错误等),或者内存不足等。
第二种:在执行EXEC之后,如正确的命令搭配错误的参数类型。
对于第一种错误,在当前2.6.5以及更高的版本中,Redis客户端将会对错误进行记录,当调用入队命令时,拒绝该事物。但是,在之前的老版本中,Redis将执行入队成功的命令,而忽略那些入队失败的命令。对此,新的处理方式,使得在流水线中包含事务变得简单,因为发送事务和读取事务的回复都只需要和服务器进行一次通讯。
对于第二种错误,Redis并没有进行回滚等特别处理,因此,事务的执行过程如果发生错误,Redis也会完整的执行完事务过程,并返回结果。
以上两种错误类型请各位看官参照上面的示例进行联系,在此,我们不再演示。

为什么说Redis不支持回滚?

对于有使用过关系型数据库的看官,可能无法理解为什么Redis有事务的功能但是不支持回滚呢?至少在目前的版本中。。。
我们回顾一下上面所说的错误类型。第一种:书写错误,配置错误。第二种:命令使用错误。换句话说,错误的原因是开发人员导致的,而不是Redis本身。对应的,只要保证输入了正确的命令,其一定会正确的执行,并且返回命令结果。除此之外,这种做法保证了在生产环境下Redis执行过程简单高效。所以,Redis的这种设计方式,使得对于开发人员自己造成的错误,需要格外小心。

------------------------------------------------------------------------------------------------------------------------------------

至此,NoSQL之Redis---事务(transaction)命令

参考资料:

redis官网:redis.io
其他资料:http://doc.redisfans.com/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: