Redis事务

Redis中为我们提供了MULTI 、 EXEC 、 DISCARD 和 WATCH 四个支持事物的命令。先简单介绍一下这四个命令。
MULTI:用于开启一个事务。
EXEC:用于结束一个事务(告诉redis我这一串命令可以执行了,如果客户端只是开启了事务而没有执行exec那么整个事务将不会执行)。
DISCARD:放弃事务(清空事务队列)
WATCH:一个类似乐观锁(CAS)的操作。

知道了这四个命令的用途,下面结合自己的认知来通过绘图的形式给解释一下redis事务的流程。
Redis事务
我们先在0号库(Redis默认创建了16个库 0~15 序列,0号库是默认库,他们是相互隔离的)里设置一个key 叫 pk = 111
Redis事务
然后这两个客户端分别开启事务
Redis事务
第一个客户端对pk进行读操作,第二个客户端对pk进行删除操作。
Redis事务
现在我先结束第二个客户端,然后在结束第一个客户端。
Redis事务
第二个显示成功执行,而第一个查询没有这个key,因为已经被第二个事务给删除掉了。
下面通过画图来给大家解释一下:
Redis事务
开启事务后,客户端提交的事务会被放到一个事务队列中去,redis实际会把不通客户端提交过来的事务分组并按照顺序排序,下来检查每一个事务结束的时间,时间早的会先执行。如果该事务影响了其他事务要操作的数据,那么redis会返回异常,具体怎么处理这是我们开发人员来关心的。

Redis没有Roll Back操作

你会发现c1不是查询pk不都抛异常了怎么没有回滚呢?而是继续向下执行,没错,Redis并不支持Roll Back操作,Redis只会因为语法错误而失败,这些问题在队列里是无法判断的,只有在执行的时候才能知晓。所以Redis的意思就是 出问题就是程序员的锅 ,因为不用回滚所以他快。

Watch 监控

实操演示
首先我set一个pk为123
Redis事务
Redis事务
客户端一二分别开启事务,然后客户端一对pk进行set操作设置为aaa,客户端二对pk进行set操作设置为bbb.然后还是二先提交,一后提交,执行结果看到
Redis事务
执行了CAS操作,看到pk的值已经改了,所以不会再执行set aaa的操作了。