redis事务以及实现乐观锁

redis事务本质

一组命令的集合,单条命令是可以保证原子性的,但是事务不保证原子性。

一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行。一次性、顺序性、排他性的执行一些命令。

-----队列 set 、get 、set  执行--

redis事务没有隔离级别概念。所有命令在事务中,并没有直接被执行,只有发起执行命令(exec)的时候才会执行

redis的事务开启以及执行过程:

1,开启事务(multi)
2,命令入队(…)
3,执行事务(exec)/放弃事务(discard)

执行事务:队列中的任务开始执行
在这里插入图片描述
放弃事务:队列中的命令都不会执行 命令 discard

在这里插入图片描述

redis事务异常情况

1,编译型异常(代码有问题,命令有错),事务中所有命令都不会执行
在这里插入图片描述

2,运行时异常,如果事务队列中存在语法错误,那么执行命令的时候,其他命令时可以正常执行的,错误命令抛出异常。如图,执行完成后队列中有的命令已经执行,有的运行时异常的命令未执行,验证了单条命令是可以保证原子性的,但是事务不保证原子性。
在这里插入图片描述

redis实现乐观锁(watch)

悲观锁和乐观锁
悲观锁:很悲观,认为什么时候都会出问题,无论做什么都会加锁
乐观锁:很乐观,认为什么时候都不会出问题,所以不会上锁。更新数据的时候去判断下,在此期间是否有人修改过这个数据,做法是价格字段version,更新前获取version,更新的时候比较version。

使用watch命令监视(加锁)取消监视unwatch(解锁)
正常情况下
在这里插入图片描述
异常情况下
开启watch后,开启事务,事务未提交之前,另外一个线程去修改值,然后再去提交事务发现事务提交失败

修改money的值
在这里插入图片描述

再去提交事务,发现事务提交失败
在这里插入图片描述
在这里插入图片描述
异常之后(事务失败后)使用unwatch取消监视(解锁),再使用watch执行一边就可以修改数据
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/HBliucheng/article/details/111768964