redis 事务学习笔记

相关命令和使用

  • MULTI:开启事物,redis会将后续的命令逐个放入队列中,然后使用EXEC命令来原子化执行这个命令队列
  • EXEC:执行事务中的所有操作命令
  • DISCARD: 取消事务,放弃执行事务块中的所有命令
  • WATCH:监视一个或多个key,如果事务在执行前,这个key(或多个key)被其他命令修改,则事务被中断,不会执行事务中的任何命令
  • UNWATCH:取消WATCH对所有key的监视

事务错误的处理

  • 语法错误(编译错误),会导致事务提交失败,所有修改回滚
  • 类型错误(运行时错误),事务不会回滚,会跳过错误命令继续执行

CAS操作实现乐观锁

WATCH 命令可以为Redis事务提供check-and-set(CAS) 行为,在MULTI开始事务之前使用

被WATCH的键会被监视,并会发觉这些键是否被改动。如果至少一个被监视的键在EXEC之前被修改了,那么整个事务都会被取消。EXEC返回nil-reply来表示事务已经失败

当使用EXEC执行事务时,首先会比对WATCH所监控的键值对,如果没发生改变,它会执行事务队列中的命令,提交事务;如果发生变化,将不会执行事务中的任何命令,同时事务回滚。当然无论是否回滚,Redis都会取消执行事务前的WATCH命令。

redis 文件依赖 redis exec_回滚

理解Redis事务上的ACID

  • 原子性 所有命令要么全部执行,要么全部不执行。而不是完全成功
  • 一致性 Redis事务可以保证命令失败的情况下得以回滚,数据能恢复到没有执行前的样子,是保证一致性的,除非Redis进程意外终结
  • 隔离性 Redis 是单进程单线程模式(v6.0之前),可以保证命令执行过程中不会被其他客户端命令打断
  • 持久性 Redis事务是不保证持久性的,这是因为Redis持久化策略中不管是RDB还是AOF都是异步执行的,不保证持久性是出于对性能的考虑