Redis 支持事务吗?如何实现?

Sherwin.Wei Lv7

Redis 支持事务吗?如何实现?

回答重点

Redis 支持事务,但它的事务与 MySQL 中的事务有所不同。MySQL 中的事务主要支持 ACID 的特性,而 Redis 中的事务主要保证的是多个命令执行的原子性,即所有的命令在一个原子操作中执行,不会被打断。

还有一个很重要的点,就是 MySQL 中的事务是支持回滚的,而 Redis 中的事务是不支持回滚的。

扩展知识

Redis 的事务

Redis 支持事务,通过使用 MULTI、EXEC、WATCH 和 DISCARD 等命令来实现。事务中的命令会被排队并在调用 EXEC 时一次性执行,保证了事务的原子性。

具体实现流程如下:

  1. 开始事务:使用 MULTI 命令开始一个事务,之后的所有命令都会被排队。
  2. 添加命令:在事务中添加命令,这些命令不会立即执行,而是存储在队列中。
  3. 执行事务:使用 EXEC 命令执行队列中的所有命令,确保原子性。
  4. 取消事务:使用 DISCARD 命令可以放弃事务,清空命令队列。
  5. 监视键:使用 WATCH 命令可以监视一个或多个键,如果在事务执行前这些键被修改,则 EXEC 将不会执行,确保数据一致性。

Redis 事务不支持回滚功能

Redis 事务一旦执行,所有命令都会被应用到数据中,即使其中某个命令失败。因此,在设计时需充分考虑可能的错误。

Redis 官网也进行了相关描述,如下图所示:

image.png

从 Redis 2.6.5 开始,服务器会在累计命令的过程中检测到错误,此时执行 EXEC 会拒绝执行事务,并且返回一个错误,同时求丢该事务。

但如果事务执行的过程中发生了错误,Redis 会继续执行剩下的命令,而不会对事务进行回滚,这个是 Redis 和 MySQL 最不一样的地方,并且也不支持多种隔离级别的设置,因为 Redis 是单线程执行,只能是串行隔离级别。

可以认为 Redis 的事务是一个残血的事务,更多只是一个噱头,不是我们平时理解的事务。

Comments