Redis事务通常会使用MULTI,EXEC,WATCH,DISCARD,UNWATCH,WATCH key [key ...]等命令来完成, Redis实现事务实现的机制与常见的关系型数据库事务特征总结如下。
异同 | BD事务 | redis事务 |
---|---|---|
相同点 | 事务在提交前不可见 | |
不同点 | 1.redis不支持回滚 2.redis事务执行期间不会锁定待修改key,其他非事务修改可以修改此key 3.非ACID标准 |
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
- 批量操作在发送 EXEC 命令前被放入队列缓存。
- 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中【但是非事务修改可以修改此key】。
一个事务从开始到执行会经历以下三个阶段:
- 开始事务
- 命令入队
- 执行事务
Redis 事务命令
命令 | 描述 |
---|---|
DISCARD | 取消事务,放弃执行事务块内的所有命令 |
EXEC | 执行所有事务块内的命令 |
MULTI | 标记一个事务块的开始 |
UNWATCH | 取消 WATCH 命令对所有 key 的监视。【redis 默认不监视key】 |
WATCH key [key ...] | 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 |
redis事务执行流程
redis > MULTI #切换redis为事务态
OK
redis > SET name dzc #事务态可以执行多个命令之一
QUEUED
redis > SET age 18 #事务态可以执行多个命令之一
QUEUED
redis > EXEC #执行事务
1) ok
2) dzc
3) 18
Redis事务的ACID特性讨论
- 原子性[不支持]
定义:事务操作要么全部执行,要么都不执行。 原子性关注点 是最终状态不存在部分成功或者失败。
Redis:队列中上下执行失败相互不受影响,且不会回滚不满足原子性要求。
- 一致性[支持]
定义: 保证数据库一致性是指当事务完成时,必须使所有数据都具有一致的状态。 一致性关注点 一致性关注数据的可见性,中间状态的数据对外部不可见,只有最初状态和最终状态的数据对外可见。
Redis:Redis事务执行期间只有提交状态数据对外可见。
- 隔离性[争议支持]
定义:事务执行期间各事务不相互影响串行执行。
Redis:Redis执行期间别的事务不会插入事务执行命令序列中是串行执行,但是执行中db通过锁定行完成隔离,而redis不会锁定key非事务命令依然可以修改删除key,导致结果看起来并不完全支持隔离性。
- 持久性[支持]
定义:事务执行完毕结果被永久的存储在磁盘中。
Redis:Redis持久性取决于redis持久化模式,Redis有能力支持持久性。
总结:
redis事务其实就是一个最终一致性的柔性事务,功能支持比较弱。由于redis事务不会锁定待更新的资源,redis在事务状态与非事务状态修改中查询结果比较混乱。使用场景可以在金融等对结果比较敏感的场景多一层保障,毕竟有这个柔性事务比没有强,但是也可以通过其他设计保证redis的数据最终一致性。