相关命令
用法
multi
开启事务后,后续所有的命令会添加到队列,不会立即执行,一旦调用exec,所有的命令才会被依次执行
事务中可能出现的错误
- 执行exec前,命令可能无法入队
产生的原因:命令本身出错、参数不正确、内存问题等等
这种错误在客户端常见,一旦出错,客户端通常会取消事务
- 执行exec后,对某些key的值操作不当
比如,对某个key的值(类型为String),进行list操作
注意:在redis2.6.5之后,一个命令发生错误,其他命令继续被执行
为什么redis不支持回滚?
- 错误的命令语法或者某个key的值---类型错误,这是编程产生的结果,可以在开发时被检测到,而不必到生产环境
- redis内部简化且速度快,因为不需要回滚
乐观锁(CAS——check-and-set)
实现方式:watch
在执行exec之前,如果有至少一个watched key被修改,整个事务取消,返回null表示事务失败
悲观锁setnx
SETNX lock.foo <current Unix time + lock timeout + 1>
处理死锁
- 1.SETNX lock.foo尝试获得锁
- 2.GET lock.foo判断锁是否过期,如果没有过期,则休眠一段时间,重复1
- 3.
GETSET lock.foo <current Unix timestamp + lock timeout + 1>