事务实现
基本命令
- MULTI
显式地表示一个事务的开启,把这些命令暂存到一个命令队列中
- EXEC
实际执行命令队列中的所有命令
- DISCARD
主动放弃事务执行,把暂存的命令队列清空(起不到回滚的效果)
- WATCH
在事务执行前,监控一个或多个键的值变化情况,当事务调用 EXEC 命令执行时,WATCH 机制会先检查监控的键是否被其它客户端修改了。如果修改了,就放弃事务执行,避免事务的隔离性被破坏。然后,客户端可以再次执行事务,此时,如果没有并发修改事务数据的操作了,事务就能正常执行。
异常分析
1、客户端发送的操作命令中存在语法错误
拒绝执行所有提交的命令操作,返回事务失败
2、命令和操作的数据类型不匹配,但 Redis 实例没有检查出错误
Redis 对错误命令报错,但正确的命令也会执行。(事务的原子性就无法得到保证)
3、在执行事务的 EXEC 命令时,Redis 实例发生了故障,导致事务执行失败
- 如 Redis 开启了 AOF 日志,那么,只会有部分的事务操作被记录到 AOF 日志中。
使用 redis-check-aof 工具检查 AOF 日志文件,可把已完成的事务操作从 AOF 文件中去除。使用 AOF 恢复实例后,事务操作不会再被执行,从而保证了原子性。
- 如 AOF 日志没有开启,那么实例重启后,数据没法恢复了,此时,也就谈不上原子性了。