请对比 Redis 事务与关系型数据库事务,说明两者在原子性、一致性、隔离性和持久性方面的主要差异,并解释 Redis 事务的 WATCH 命令如何影响 CAS 行为。
考察说明
考查对 Redis 事务模型与关系型数据库 ACID 特性的理解,以及 WATCH 条件更新的掌握。
回答思路
- 【回答框架 1】Redis 事务通过 MULTI、EXEC、DISCARD 和 WATCH 实现,将多个命令按顺序排队,EXEC 时按序执行。与关系型数据库事务不同,Redis 事务不保证原子性,如果某条命令执行失败,其他命令仍会执行,不支持回滚。
- 【回答框架 2】在一致性方面,Redis 事务在 EXEC 之前不会执行命令,因此不会出现部分执行的中间状态,但若执行中出错,数据库可能处于不一致状态。关系型数据库通过 ACID 保证强一致性,Redis 则提供较弱的一致性保证。
- 【回答框架 3】隔离性上,Redis 是单线程执行,事务内命令依次执行,天然隔离,但 WATCH 命令用于乐观锁,通过监视键在 EXEC 时检查是否被其他客户端修改,若被修改则整个事务终止。关系型数据库通过锁和 MVCC 提供不同隔离级别。
- 【回答框架 4】持久性方面,Redis 事务的持久性依赖于 RDB 和 AOF 持久化配置,默认可能丢失数据,而关系型数据库通常通过 WAL 保证持久性。
- 【关键点 1】Redis 事务不支持回滚,命令执行失败不阻塞其他命令。
- 【关键点 2】WATCH 提供 CAS 语义,键被修改则事务被取消。
- 【关键点 3】Redis 单线程执行保证事务内命令的串行性,隔离性实现简单。
- 【易错点 1】误认为 Redis 事务具备原子性,实际其不具备完全的原子性。
- 【易错点 2】忽略 WATCH 需要在 MULTI 之前调用,否则无法实现 CAS。
- 【易错点 3】混淆持久性保证,Redis 默认配置下可能丢失数据。