Redis事务
Redis事务
说明
可以一次执行多个命令,本质是一组命令的集合。一个事物中的所有命令都会序列化,按顺序的串行化执行而不会被其他命令插入
区别于数据库事物:
常用命令
multi:事务的开始
exec:执行事务
DISCARD:放弃事务
UNWATCH
WATCH key
命令演示
case1 正常执行:
127.0.0.1:6379> MULTI #开启事务 OK 127.0.0.1:6379(TX)> set k1 v1 QUEUED 127.0.0.1:6379(TX)> lpush list 1 2 3 QUEUED 127.0.0.1:6379(TX)> set k2 v2 QUEUED 127.0.0.1:6379(TX)> INCR count QUEUED 127.0.0.1:6379(TX)> EXEC# 执行事务 1) OK 2) (integer) 3 3) OK 4) (integer) 1
case2 放弃事务:
127.0.0.1:6379> MULTI #开启事务 OK 127.0.0.1:6379(TX)> 127.0.0.1:6379(TX)> set k1 v2 QUEUED 127.0.0.1:6379(TX)> set k2 v2 QUEUED 127.0.0.1:6379(TX)> DISCARD #放弃事务 OK 127.0.0.1:6379> get k1 "v1"
case3 事务中出现语法错误,则全部执行失败:
127.0.0.1:6379> MULTI #开启事务 OK 127.0.0.1:6379(TX)> set k1 1111 QUEUED 127.0.0.1:6379(TX)> set k2 222222 QUEUED 127.0.0.1:6379(TX)> set k3 # 语法错误 (error) ERR wrong number of arguments for 'set' command 127.0.0.1:6379(TX)> EXEC #执行事务 (error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379> get k1 #k1没有修改成功,还是原来的值 "v1" 127.0.0.1:6379>
case4 事务中没有语法错误,编译通过。出现运行时异常:
遇到失败并不会像传统数据库一样全部回滚,而是对的执行,错误的失败。
127.0.0.1:6379> MULTI #开启事务 OK 127.0.0.1:6379(TX)> set k1 abc # 设置k1为abc QUEUED 127.0.0.1:6379(TX)> get k1 QUEUED 127.0.0.1:6379(TX)> set email 123@qq.com QUEUED 127.0.0.1:6379(TX)> INCR email #运行时异常 QUEUED 127.0.0.1:6379(TX)> get count QUEUED 127.0.0.1:6379(TX)> EXEC #执行事务 1) OK 2) "abc" 3) OK 4) (error) ERR value is not an integer or out of range 5) "1" 127.0.0.1:6379> get k1 #k1修改成功 "abc" 127.0.0.1:6379> get email # email设置成功 "123@qq.com" 127.0.0.1:6379>
case5 watch命令监控:
watch命令所监控的字段,如果字段被其他进程修改了,则执行失败。
case6 unwatch命令取消监控:
使用unwatch命令之后,即使在事务中字段被其他进程修改,也不会失败。
总结
MULTI命令开启一个事务
入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事物队列里面
EXEC命令执行事务