事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
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的监控。
时间: 2024-10-19 12:20:15