redis

redis(十四:事务)

2022-12-06  本文已影响0人  supremecsp

事务在执行时,会提供专门的属性保证,包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),也就是 ACID 属性。

Redis 提供了 MULTI(开启事务)、EXEC (提交事务)两个命令来完成事务

原子性
1,命令入队时就报错,会放弃事务执行,保证原子性;
2,命令入队时没报错,实际执行时报错,不保证原子性;
3,EXEC 命令执行时实例故障,如果开启了 AOF 日志,可以保证原子性。(使用 redis-check-aof 工具检查 AOF 日志文件,这个工具可以把未完成的事务操作从 AOF 文件中去除。)。如果只有 RDB日志也没问题,RDB不会在事务执行时执行,所以 RDB 文件中不会记录只执行了一部分的结果数据。之后用 RDB 恢复实例数据,恢复的还是事务之前的数据。

重点看第二点:

#开启事务
127.0.0.1:6379> MULTI
OK
#发送事务中的第一个操作,LPOP命令操作的数据类型不匹配,此时并不报错
127.0.0.1:6379> LPOP key1
QUEUED
#发送事务中的第二个操作
127.0.0.1:6379> DECR key2
QUEUED
#实际执行事务,事务第一个操作执行报错
127.0.0.1:6379> EXEC
1) (error) WRONGTYPE Operation against a key holding the wrong kind of value
2) (integer) 8

执行失败Redis并不会回滚;Redis 中并没有提供回滚机制。虽然 Redis 提供了 DISCARD 命令,但是,这个命令只能用来主动放弃事务执行,把暂存的命令队列清空,起不到回滚的效果。

补充:
redis 127.0.0.1:6379>type key
此时会显示出该key存储在现在redis服务器中的类型,例如:
redis 127.0.0.1:6379>hash
则表示key为以hash类型存储在redis服务器里的,此时操作这个数据就必须使用hset、hget等操作方法。
如果是zset如下:
redis 127.0.0.1:6379>zset
则表示数据类型为Sorted Sets的。此时就需要使用zadd、zrange等操作方法,否则就会报WRONGTYPE Operation against a key holding the wrong kind of value这个错误!

隔离性
1,并发操作在 EXEC 命令前执行,此时,隔离性的保证要使用 WATCH 机制来实现,否则隔离性无法保证;
2,并发操作在 EXEC 命令后执行,此时,隔离性可以保证。

WATCH 机制的作用是,在事务执行前,监控一个或多个键的值变化情况,当事务调用 EXEC 命令执行时,WATCH 机制会先检查监控的键是否被其它客户端修改了。如果修改了,就放弃事务执行,避免事务的隔离性被破坏。然后,客户端可以再次执行事务,此时,如果没有并发修改事务数据的操作了,事务就能正常执行,隔离性也得到了保证。

持久性
如果 Redis 没有使用 RDB 或 AOF,那么事务的持久化属性肯定得不到保证。
而RBD快照时间比较长,就是AOF的everysec也是有1秒的数据丢失可能性,所以持久性属性是得不到保证的。

一致性
一致性理解:应用系统从一个正确的状态到另一个正确的状态,而ACID就是说事务能够通过AID来保证这个C的过程。C是目的,AID都是手段。
既然手段达不到保障,一致性也就没什么谈论的必要了。

上一篇下一篇

猜你喜欢

热点阅读