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>