Redis总结(五)——事务
前言:
对于关系型数据库,简单地说,事务表示一组动作,要么全部执行,要么全部不执行。例如,在ATM机,用户A给用户B转了100元,那么需要在用户B 的账户中加入100元,在用户A 的账户中减去100元,这两个行为要么全部执行,要么不执行,否则会出现数据不一致测情况。
Redis提供了简单的事务功能,将一组需要一起执行的命令放到multi和exec两个命令之,mutli命令代表事务开始,exec命令代表事务结束,它们之间的命令是原子顺序执行。
例:
下面操作实现了上述转账的操作
可以看到decrby(减) 和incrby(加)命令返回结果是QUEUED,代表命令没有真正执行,而是暂时保存在Redis中。如果此时另一个客户端执行get B 操作,返回结果应该是nil
只有当执行exec后,用户A的转给用户B的钱才是完成。
另一个客户端查看同样用户A和B的余额也会是发生变化的
Rdis和Mysql事务的对比:
rollback与discard的区别:
如果事务中已经成功执行了两条语句,第三条语句出错,rollback后,前二条语句影响消失。discard只是结束本次事务,前两条语句造成的影响仍然还在。
如果事务中命令出现错误,Redis的处理机制也不同
1、命令错误:
例如下面操作将incrby写成了incrbby,属于语法错误,会造成整个事务无法执行,A和B的值未发生变化:
2)运行时错误
例如在给B加100元时,误把incrby对应的命令写错了,这就是运行时命令,因为语法是正确的:
可以看到Redis并不支持回滚功能,decrby B 100 命令已经执行成功,开发人员需要自己修复这类问题。
watch:
有些应用场景需要在执行事务之前,去报事务的key没有被其他客户端修改过,才执行(类似乐观锁)。Redis提供watch命令来解决这类问题。Redis的事务中,启用的是乐观锁,只负责监测key没有被改动.
执行exec之后,返回nil,说明监视的ticket已经改变了,事务就取消了。
watch key1 key2 ... keyN
作用:监听key1 key2..keyN有没有变化,如果有变, 则事务取消
unwatch
作用: 取消所有watch监听
总结:
Redis提供了简单的事务,之所以说它简单,主要是因为它不支持事务中的回滚特性,同时无法实现命令之间的逻辑关系计算,当然也体现了Redis的“keep it simple”的特性。