概述
Redis事务本质:
一组命令的集合!一个事务中的所有命令都会被序列化,在事务执行过程的中,会按照顺序执行!一次性、顺序性、排他性!执行一些列的命令!
Redis单条命令式保存原子性的,但是事务不保证原子性!
Redis事务没有没有隔离级别的概念!
模型:------ 队列set set set执行------
所有的命令在事务中,并没有直接被执行!只有发起执行命令的时候才会执行!(Exec)
redis的事务
- 开启事务( multi )
- 命令入队(…)
- 执行事务( exec )
- 取消事务
异常
-
编译型异常(代码有问题!命令有错! ),事务中所有的命令都不会被执行!
-
运行时异常( 1/0),如果事务队列中存在语法性,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常
乐观锁
- 悲观锁:
很悲观,认为什么时候都会出问题,无论做什么都会加锁! - 乐观锁:
很乐观,认为什么时候都不会出问题,所以不会上锁!更新数据的时候去判断一下,在此期间是否有人修改过这个数据
1.获取version
2.更新的时候比较version
正常执行成功
模拟多线程操作
在事务进入队列还没有执行的时候,第二个客户端对money进行操作,此时再执行事务,就会失败,因为加了锁。
如果执行失败,只要获取最新的值就好了。
解锁后重新监视,执行时比对版本有没有发生变化,没有就执行成功,否则执行依旧失败,继续重复上述步骤,直到执行成功。