redis事务

 

 

Mysql 

redis

开启事务

start transaction

multi

执行语句

普通sql (建表语句会立即执行)

普通redis命令

取消

rollback 回滚

discard 取消

提交

commit

exec

模拟张三转钱到李四账户100

redis事务

multi开启事务,张三的钱-100,lisi的钱+100,然后写个错误执行命令,exec执行。

查询发现因为事务执行中有错误的命令,然后进行了回滚。

 

不能回滚的情况

语法本身没错,但命令适用对象有问题,exec之后,会执行正确的语句,并跳过有不适当的语句。这里其实就没有真正意义上的回滚事务

redis事务

 

redis的乐观锁

张三李四同时买票,开启两个redis客户端。

张三买票,开启了事务,但是还为进行提交。

redis事务

切换到第二个redis客户端,李四买票,开启了事务,事务进行了提交,结果:票数-1,李四的钱-50

redis事务

此时再切换第一个客户端,进行事务提交,结果票数-1成为负数,并且张三的钱数-50;

redis事务

可以看到结果是我们不想要的。解决办法:使用watch命令负责监控key有没有被改动过,在事务中,如果任意一个监控的key有改变,则事务取消。

重置数据,张三买票,开启事务,且使用watch监控ticket,不提交事务

redis事务

进入第二客户端,李四买票,也使用watch监控ticket,结果:票数-1,李四钱数-50,抢到票

redis事务

进入第一个客户端,提交事务,发现该事务被取消了。张三没抢到票。

redis事务