redis学习(五)事务

事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

1、事务基本命令:

multi:标记一个事务块的开始

exec:执行所有事务块内的命令

discard:取消事务,放弃执行事务块内的所有命令

watch:监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

unwatch:取消 WATCH 命令对所有 key 的监视。

redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> set k1 v1
QUEUED
redis 127.0.0.1:6379> set k2 v2
QUEUED
redis 127.0.0.1:6379> get k1
QUEUED
redis 127.0.0.1:6379> set k1 v11
QUEUED
redis 127.0.0.1:6379> get k1
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) OK
3) "v1"
4) OK
5) "v11"
redis 127.0.0.1:6379>

2、错误的处理

之所以说部分支持事务,是因为redis对事务中语法错误和运行中错误的处理不同。

语法时错误:对事务中的所有命令都不执行

redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> set k1 v1
QUEUED
redis 127.0.0.1:6379> sd dfsdwwe
(error) ERR unknown command 'sd'
redis 127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
redis 127.0.0.1:6379>

运行时错误:会忽略错误的命令,其他命令会继续执行

redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> SADD num 1 2 3
QUEUED
redis 127.0.0.1:6379> set k1 v1
QUEUED
redis 127.0.0.1:6379> get num
QUEUED
redis 127.0.0.1:6379> get k1
QUEUED
redis 127.0.0.1:6379> EXEC
1) (integer) 3
2) OK
3) (error) ERR Operation against a key holding the wrong kind of value
4) "v1"
redis 127.0.0.1:6379>

3、乐观锁

乐观锁意思就是乐观的认为不同的客户端,大部分情况下,客户端会访问不同的健,不太可能会冲突。只有在冲突的情况下,Redis使用WATCH命令实现事务的“检查再设置”(CAS)行为。

作为WATCH命令的参数的键会受到Redis的监控,Redis能够检测到它们的变化。在执行EXEC命令之前,如果Redis检测到至少有一个键被修改了,那么整个事务便会中止运行,然后EXEC命令会返回一个Null值,提醒用户事务运行失败。

如:使用watch对健k1进行监控,设置k1的值为v1,然后进入事务,事务中设置k1的值为v2,然后执行EXEC运行事务,最后使用get查看k1的值,可以看到k1的值没有改变,说明事务中的命令根本没有执行(因为WATCH监控mykey的过程中,k1被修改了,所以随后的事务便会被取消)

redis 127.0.0.1:6379> WATCH k1
OK
redis 127.0.0.1:6379> set k1 v1
OK
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> get k1
QUEUED
redis 127.0.0.1:6379> SET k1 v2
QUEUED
redis 127.0.0.1:6379> get k1
QUEUED
redis 127.0.0.1:6379> EXEC
(nil)
redis 127.0.0.1:6379> get k1
"v1"
redis 127.0.0.1:6379>

可以使用unwatch k1,来取消对k1的监控。

原文地址:https://www.cnblogs.com/pjfmeng/p/7909444.html