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

Sherwin.Wei Lv7

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

回答重点

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

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

扩展知识

Redis 的事务

Redis 支持事务,通过使用 MULTIEXECWATCHDISCARD 等命令来实现。事务中的命令会被排队并在调用 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