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命令执行事务

 

posted @ 2023-07-08 19:32  邵杠杠  阅读(6)  评论(0编辑  收藏  举报