- 事务中的所有命令都会序列化、按顺序地执行。
- 事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
事务
multi:标记一个事务块的开始。 随后的指令将在执行EXEC时作为一个原子执行。
正常的执行事务
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 1
QUEUED
127.0.0.1:6379(TX)> set k2 2
QUEUED
127.0.0.1:6379(TX)> get k2
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK
3) "
127.0.0.1:6379> get k1
"1"
127.0.0.1:6379>
放弃事务
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k3 3
QUEUED
127.0.0.1:6379(TX)> discard
OK
127.0.0.1:6379> get k3
(nil)
127.0.0.1:6379>
编译时异常 所有命令不执行
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k3 3.0
QUEUED
127.0.0.1:6379(TX)> getset kkk
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k3
(nil)
127.0.0.1:6379>
运行时异常 其他命令照常执行,错误命令抛出异常
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 "hello"
QUEUED
127.0.0.1:6379(TX)> incr k1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> get k3
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
4) OK
5) "v3"
127.0.0.1:6379> get k3
"v3"
127.0.0.1:6379>
watch 乐观锁
当 EXEC 被调用时, 不管事务是否成功执行, 对所有键的监视都会被取消。
另外, 当客户端断开连接时, 该客户端对键的监视也会被取消。
127.0.0.1:6379> watch money #监控money
OK
# 此时在另一个客户端修改money
# 127.0.0.1:6379> set money 1000
# OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> get money
QUEUED
127.0.0.1:6379(TX)> set money 100
QUEUED
127.0.0.1:6379(TX)> exec
(nil) # 执行失败
127.0.0.1:6379> get money
"1000"
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set money 200
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
127.0.0.1:6379> get money
"200"
127.0.0.1:6379>