1、Redis事务机制
严格意义来讲,Redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的。Redis的事务实质上是命令的集合,在一个事务中要么所有命令都被执行,要么所有事务都不执行。(不关心执行结果)
Redis事务三个阶段:
- 开始事务
- 命令入队
- 执行事务
从下图中可以看出,当开启事务后,所要执行的命令并不是马上执行,而是放入队列中,等事务提交后批量执行。
注意:
- redis并没有事务回滚的机制,开发者需要在命令执行失败后自行处理。
- 如果redis事务中命令出错,那么所有命令都不会被执行。
- 如果redis事务中命令运行时出错,那么其他正确的命令正常执行。
监控机制:
Redis事务启用的是乐观锁机制,通过WATCH
命令来监控一个或多个key。如果被监测的key没有被改变,则事务正常执行。如果被监测的key被改变,则事务不执行。
2、Redis事务命令
image.png3、实例
1.执行成功
redis开启事务后,执行的命令并不是马上被执行,而是做入队操作,提交事务后才批量执行命令。
image.png
2.执行失败
执行一个错误命令,则事务中所有命令都不执行。
3.执行成功,但是结果失败
set k1、k2、k3都执行成功了,但是执行incr k2的时候因为k2是字符串无法做自增操作,所以incr k2失败。可以得出结论redis事务不保证原子性,只要命令(incr)对了,事务就会执行,不管执行结果是否成功。
image.png
4.WATCH测试
设置k1,并对k1监控。事务等终端2对k1修改后提交
image.png
修改k1的值
image.png
k1被终端2给修改了,终端1的事务无法执行。
4、总结
1、Redis事务采用的是队列缓存和批量处理的机制,事务中命令并不马上执行,先入队,等事务提交后一起执行。
2、Redis事务关心的是事务中命令是否被执行,而不关心命令执行后结果是否正确成功。
3、不考虑外界因素情况下,Redis事务中命令是否执行可以结合java的异常机制来理解。命令错误,则全部不执行。(类比java强制性异常)命令正确,但是执行失败,其他正确命令正常执行。(运行时异常)
网友评论