事务本质:一组命令的集合
- 数据库事务与Redis事务
- 数据库事务
数据库事务通过ACID(原子性.一致性.隔离性.持久化)来保证.
数据库中除查询操作以外,插入(insert).删除(delete)和更新(update)这三种操作都会对数据造成影响,因为事务处理能够保证一系列操作可以完全地执行或者完全不执行,因此在一个事务被提交以后,该事务中的任何一条sql语句在被执行的时候,都会生成一条撤销日志(undo log)
- Redis事务
Redis事务提供了一种将"多个命令打包,然后一次性,按顺序执行"的机制,并且事务在执行期间不会主动中断. 服务器在执行完事务中的所有命令后,才会执行客户端的其他命令.
Redis中一个事务从开始到执行会经历开始事务(muiti).命令入队和执行事务(exec)三个阶段,事务中的命令在加入时都没有被执行,直到提交时才会开始执行(exec)一次性完成.
一组命令中存在两种错误不同处理方式
1)代码语法错误(编译时异常)所有命令都不执行
2)代码逻辑错误(运行时错误),其他命令可以正常执行(该点不保证事务的原子性)
为什么Redis不支持回滚来保证原子性
优点:
- Redis命令只会因为语法错误而失败(但该问题无法在入队时被发现),或是命令用在了错误类型的键上面:这也就是说,从实用性角度来说,失败是由编程错误造成的,错误应该在开发过程中被发现,而不应该出现在生产环境中.
- 不支持回滚.Redis的内部可以保持简单并快速
** 鉴于无法避免程序员错误
事务监控
悲观锁: 认为什么 时候都会出现问题,无论什么操作都会加上锁
乐观锁: 认为什么时候都不会出现问题,所以不会上锁! 更新数据的时候去判断,在此期间是否有人修改过这个数据.
使用cas实现乐观锁
Redis使用watch key监控指定数据,相当于加乐观锁
watch保证事务只能在所有被监视键都没有被修改的前提下执行.如果这个前提不能满足的话,事务就不会执行.
watch执行流程