Redis事务(Transactions)

相关命令

  • multi 开启事务
  • exec 开启命令执行
  • discard 取消事务(事务队列会清空, 客户端退出事务状态)
  • watch 乐观锁
  • unwatch

用法

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>

官网地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。