127.0.0.1:6379> multi # 开启事务 OK 127.0.0.1:6379> set name1 yangl1 # 命令进入队列 QUEUED 127.0.0.1:6379> set name2 yangl2 # 命令进入队列 QUEUED 127.0.0.1:6379> get name1 # 命令进入队列 QUEUED 127.0.0.1:6379> set name3 yangl3 # 命令进入队列 QUEUED 127.0.0.1:6379> keys * # 命令进入队列 QUEUED 127.0.0.1:6379> exec # 执行事务 1) OK 2) OK 3) "yangl1" 4) OK 5) 1) "name2" 2) "name1" 3) "name3" 127.0.0.1:6379>
取消事务(discurd)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
127.0.0.1:6379> multi # 开启事务 OK 127.0.0.1:6379> set name1 yangl1 # 命令进入队列 QUEUED 127.0.0.1:6379> set name2 yangl2 # 命令进入队列 QUEUED 127.0.0.1:6379> DISCARD # 放弃事务 OK 127.0.0.1:6379> EXEC # 执行事务 (error) ERR EXEC without MULTI 127.0.0.1:6379> 127.0.0.1:6379> get name1 # 被放弃事务中命令并未执行 (nil) 127.0.0.1:6379>
事务错误
代码语法错误
(编译时异常)所有的命令都不执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
127.0.0.1:6379> MULTI # 开始事务 OK 127.0.0.1:6379> set name1 yangl # 命令进入队列 QUEUED 127.0.0.1:6379> set name2 yangl2 # 命令进入队列 QUEUED 127.0.0.1:6379> get name1 name2 # 错误命令 (error) ERR wrong number of arguments for 'get' command # 会报错但是不影响后续命令入队 127.0.0.1:6379> 127.0.0.1:6379> set name3 yangl3 # 命令进入队列 QUEUED 127.0.0.1:6379> get name3 # 命令进入队列 QUEUED 127.0.0.1:6379> EXEC # 执行事务 (error) EXECABORT Transaction discarded because of previous errors. # 执行报错 127.0.0.1:6379> get name1 (nil) # 其他命令并没有被执行 127.0.0.1:6379>
代码逻辑错误
(运行时异常) 其他命令能正常执行 ——> 所以不保证事务的原子性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
127.0.0.1:6379> MULTI # 开启事务 OK 127.0.0.1:6379> set name1 yangl1 # 命令进入队列 QUEUED 127.0.0.1:6379> set name2 yangl2 # 命令进入队列 QUEUED 127.0.0.1:6379> INCR name1 # 命令进入队列(运行时会报错,对字符串进行增量) QUEUED 127.0.0.1:6379> get name2 # 命令进入队列 QUEUED 127.0.0.1:6379> EXEC # 执行事务 1) OK 2) OK 3) (error) ERR value is not an integer or out of range 4) "yangl2" 127.0.0.1:6379>