搞懂Redis(四)-Redis事务

142 阅读2分钟

事务本质:一组命令的集合

  1. 数据库事务与Redis事务
  • 数据库事务 数据库事务通过ACID(原子性.一致性.隔离性.持久化)来保证. 数据库中除查询操作以外,插入(insert).删除(delete)和更新(update)这三种操作都会对数据造成影响,因为事务处理能够保证一系列操作可以完全地执行或者完全不执行,因此在一个事务被提交以后,该事务中的任何一条sql语句在被执行的时候,都会生成一条撤销日志(undo log)
  1. Redis事务 Redis事务提供了一种将"多个命令打包,然后一次性,按顺序执行"的机制,并且事务在执行期间不会主动中断. 服务器在执行完事务中的所有命令后,才会执行客户端的其他命令. Redis中一个事务从开始到执行会经历开始事务(muiti).命令入队和执行事务(exec)三个阶段,事务中的命令在加入时都没有被执行,直到提交时才会开始执行(exec)一次性完成. 一组命令中存在两种错误不同处理方式 1)代码语法错误(编译时异常)所有命令都不执行 2)代码逻辑错误(运行时错误),其他命令可以正常执行(该点不保证事务的原子性)
为什么Redis不支持回滚来保证原子性

优点:

  • Redis命令只会因为语法错误而失败(但该问题无法在入队时被发现),或是命令用在了错误类型的键上面:这也就是说,从实用性角度来说,失败是由编程错误造成的,错误应该在开发过程中被发现,而不应该出现在生产环境中.
  • 不支持回滚.Redis的内部可以保持简单并快速 ** 鉴于无法避免程序员错误
事务监控
  • 悲观锁: 认为什么 时候都会出现问题,无论什么操作都会加上锁
  • 乐观锁: 认为什么时候都不会出现问题,所以不会上锁! 更新数据的时候去判断,在此期间是否有人修改过这个数据.
  • 使用cas实现乐观锁 Redis使用watch key监控指定数据,相当于加乐观锁 watch保证事务只能在所有被监视键都没有被修改的前提下执行.如果这个前提不能满足的话,事务就不会执行. watch执行流程 watch执行流程