Redis事务是一个单独的隔离操作∶事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用就是串联多个命令防止别的命令插队。
从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis 会将之前的命令队列中的命令依次执行。组队的过程中可以通过discard来放弃组队。
redis事务的特性
- 单独的隔离操作。事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断
- 没有隔离级别的概念,队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行。
- 不保证原子性,事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。
redis事务的使用
正常执行,由于EXEC的原因,mykey的能被提交修改。
# 开启事务
MULTI
INCR mykey
INCR mykey
DECR mykey
# 执行事务
EXEC
#输出
1) (integer) 1
2) (integer) 2
3) (integer) 1
放弃事务,由于DISCARD的终止了事务,下面的mykey将不会发生更改。
# 开启事务
MULTI
INCR mykey
INCR mykey
DECR mykey
# 终止事务
DISCARD
#输出
OK
全部放弃,组队中某个命令SET testKey出现了报告错误,执行时整个的所有队列都会被取消。·
# 开启事务
MULTI
SET intKey 4
SET strKey test
SET testKey
# 执行事务
EXEC
#输出
(error) EXECABORT Transaction discarded because of previous errors.
部分成功,如果执行阶段某个命令INCR strKey ,由于strKey是字符串,用了自增1的命令,组队不会报错,执行会报错,则只有报错的命令不会被执行,而其他的命令都被执行。最终GET intKey的值会被修改成6.
# 开启事务
MULTI
SET intKey 4
SET strKey test
INCR strKey
SET intKey 6
# 执行事务
EXEC
#输出
1) OK
2) OK
3) (error) ERR value is not an integer or out of range
4) OK