Redis - 事务隔离机制

本文解释了Redis事务的本质,包括命令批处理、非ACID特性、乐观锁实现的简单隔离性,以及watch命令在多线程执行中的作用。同时讨论了并发场景中资源超卖问题及其解决方案。
Redis 的事务的本质是一组命令的批处理。这组命令在执行过程中会被顺序地、一次性
全部执行完毕,只要没有出现语法错误,这组命令在执行期间是不会被中断。

当事务中的命令出现语法错误时,整个事务在 exec 执行时会被取消。

如果事务中的命令没有语法错误,但在执行过程中出现异常,该异常不会影响其它命令
的执行。(比如incrby一个字符)
Redis 的事务仅保证了数据的一致性,不具有像 DBMS 一样的 ACID 特性。
这组命令中的某些命令的执行失败不会影响其它命令的执行,不会引发回滚。即不具备
原子性。
这组命令通过乐观锁机制实现了简单的隔离性。没有复杂的隔离级别。
这组命令的执行结果是被写入到内存的,是否持久取决于 Redis 的持久化策略,与事务
无关。
Redis 事务通过三个命令进行控制。
muti:开启事务
exec:执行事务
discard:取消事务

在并发场景下可能会出现多个客户端对同一个数据进行修改的情况。

例如:有两个客户端 C 左与 C 右,C 左需要申请 40 个资源,C 右需要申请 30 个资源。
它们首先查看了当前拥有的资源数量,即 resources 的值。它们查看到的都是 50,都感觉资
源数量可以满足自己的需求,于是修改资源数量,以占有资源。但结果却是资源出现了“超
卖”情况。
为了解决这种情况,Redis 事务通过乐观锁机制实现了多线程下的执行隔离。
Redis 通过 watch 命令再配合事务实现了多线程下的执行隔离。

 

 

其内部的执行过程如下:1) 当某一客户端对 key 执行了 watch 后,系统就会为该 key 添加一个 version 乐观锁,并
初始化 version。例如初值为 1.0
2) 此后客户端 C 左将对该 key 的修改语句写入到了事务命令队列中,虽未执行,但其将该
key value 值与 version 进行了读取并保存到了当前客户端缓存。此时读取并保存的是
version 的初值 1.0
3) 此后客户端 C 右对该 key 的值进行了修改,这个修改不仅修改了 key value 本身,同
时也增加了 version 的值,例如使其 version 变为了 2.0,并将该 version 记录到了该 key
信息中。
4) 此后客户端 C 左执行 exec,开始执行事务中的命令。不过,其在执行到对该 key 进行修
改的命令时,该命令首先对当前客户端缓存中保存的 version 值与当前 key 信息中的
version 值。如果缓存 version 小于 key version,则说明客户端缓存的 key value
经过时,该写操作如果执行可能会破坏数据的一致性。所以该写操作不执行。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值