Redis事务:是一个单独的隔离操作。一个事务中的所有命令都会被序列化、按顺序执行。事务在执行的过程中不会被其他命令打断。主要作用就是串联多个命令,防止其他命令插队。
Redis事务流程
- 开启事务 (multi)
- 命令入队
- 执行事务(exec)
1 | 127.0.0.1:6379> multi |
放弃事务
1 | 127.0.0.1:6379> discard |
组队的时候发生异常,事务中的所用命令都不会执行。
运行时发生异常,其他命令正常执行,异常命令抛出异常。
监控(使用watch实现乐观锁)
悲观锁
- 认为任何时候都会出现问题,无论做什么都加锁。
乐观锁
- 认为什么时候都不会出问题,所以不会上锁,更新数据时去判断一下,在此期间是否有人修改过这个数据。
- 获取version
- 更新的时候比较version
测试监视功能
1 | 127.0.0.1:6379> set money 100 |
测试多线程修改值,使用watch可以当作redis的乐观锁操作
客户端1:对money对象进行监视,并开启事务,先不执行事务
1 | 127.0.0.1:6379> watch money |
再打开一个客户端2,对money对象的值进行修改
1 | 127.0.0.1:6379> get money |
在客户端1中执行事务,因为监视的值发生了改变,所以事务执行失败!
1 | 127.0.0.1:6379> exec |
自旋锁
执行失败后,放弃监视(解锁),再重新监视(加锁),获取监视对象的最新值,再执行事务,直到成功。
1 | 127.0.0.1:6379> unwatch |
Reids事务特性
- 单独的隔离操作
- 事务中的所有命令都会被序列化、按顺序执行。在事务执行的过程中不会被其他客户端发送过来的命令请求所打断。
- 不保证原子性
- 事务中如果有一条命令执行失败,其后的命令仍然会执行,没有回滚。
1 |
|