Redis 支持事务吗?如何实现?
Redis 支持事务吗?如何实现?
回答重点
Redis 支持事务,但它的事务与 MySQL 中的事务有所不同。MySQL 中的事务主要支持 ACID 的特性,而 Redis 中的事务主要保证的是多个命令执行的原子性,即所有的命令在一个原子操作中执行,不会被打断。
还有一个很重要的点,就是 MySQL 中的事务是支持回滚的,而 Redis 中的事务是不支持回滚的。
扩展知识
Redis 的事务
Redis 支持事务,通过使用 MULTI、EXEC、WATCH 和 DISCARD 等命令来实现。事务中的命令会被排队并在调用 EXEC 时一次性执行,保证了事务的原子性。
具体实现流程如下:
- 开始事务:使用
MULTI命令开始一个事务,之后的所有命令都会被排队。 - 添加命令:在事务中添加命令,这些命令不会立即执行,而是存储在队列中。
- 执行事务:使用
EXEC命令执行队列中的所有命令,确保原子性。 - 取消事务:使用
DISCARD命令可以放弃事务,清空命令队列。 - 监视键:使用
WATCH命令可以监视一个或多个键,如果在事务执行前这些键被修改,则EXEC将不会执行,确保数据一致性。
Redis 事务不支持回滚功能
Redis 事务一旦执行,所有命令都会被应用到数据中,即使其中某个命令失败。因此,在设计时需充分考虑可能的错误。
Redis 官网也进行了相关描述,如下图所示:
从 Redis 2.6.5 开始,服务器会在累计命令的过程中检测到错误,此时执行 EXEC 会拒绝执行事务,并且返回一个错误,同时求丢该事务。
但如果事务执行的过程中发生了错误,Redis 会继续执行剩下的命令,而不会对事务进行回滚,这个是 Redis 和 MySQL 最不一样的地方,并且也不支持多种隔离级别的设置,因为 Redis 是单线程执行,只能是串行隔离级别。
可以认为 Redis 的事务是一个残血的事务,更多只是一个噱头,不是我们平时理解的事务。
Comments