Redis事务的简单理解


Redis事务的命令如下所示:

先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令

示例如下:

//开始一个事务
127.0.0.1:6379> MULTI
OK
//将3个元素添加到集合set-test中
127.0.0.1:6379> SADD set-test c java c++
QUEUED
//遍历set-test集合
127.0.0.1:6379> SMEMBERS set-test
QUEUED
//触发事务
127.0.0.1:6379> EXEC 1) (integer) 3 2) 1) "c++" 2) "java" 3) "c" 127.0.0.1:6379>

 

 

 Redis 事务可以一次执行多个命令, 并且带有以下特征:

  • 批量操作在发送 EXEC 命令前被放入队列缓存。
  • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

注意:Redis的事务没有关系数据库事务提供的回滚(rollback) 功能,因此必须在事务执行出错后进行处理(比如将数据库复原回事务执行前的状态等)。

由于Redis不支持回滚功能,也使得Redis在事务上可以保持简洁和快速。

因此,在Redis事务中会出现两类错误:
1.命令语法错误、参数错误等,命令没有进入事务的命令队列,直接就返回错误。
2.命令进入事务的命令队列,但在执行EXEC后出错,例如对错误的数据类型使用了不支持的操作。

 

客户端可以在事务提交前就感知到第一类错误,一般客户端在收到第一类错误时会discard当前事务。
Redis2.6.5之前的版本在执行EXEC时会忽略第一类错误,执行队列中的其他命令。
Redis2.6.5之后的版本会记录第一类错误,当执行EXEC命令时返回:
(error) EXECABORT Transaction discarded because of previous errors.
对于第二类错误,Redis会忽略失败的命令,继续执行队列中的其他命令。即一个事务内的操作,可能会出现一部分成功,一部分失败的情况。

第一类错误,如下所示:

//开始一个事务
127.0.0.1:6379> MULTI
OK
//将3个元素添加到集合set-test中
127.0.0.1:6379> SADD set-test c java c++
QUEUED
//遍历set-test集合的命令出错
127.0.0.1:6379> SMEMBERS
(error) ERR unknown command 'SMEM'
//正确的遍历命令
127.0.0.1:6379> SMEMBERS set-test
QUEUED
127.0.0.1:6379>
//触发事务不成功
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379>

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM