Redis 事务

Redis 事务

​ Redis 的事务的本质是一组命令的批处理。这组命令在执行过程中会被顺序地、一次性全部执行完毕,只要没有出现语法错误,这组命令在执行期间是不会被中断。

Redis事务特性

Redis 的事务仅保证了数据的一致性,不具有像 DBMS 一样的 ACID 特性。

  • 这组命令中的某些命令的执行失败不会影响其它命令的执行,不会引发回滚。即不具备原子性。

  • 这组命令通过乐观锁机制实现了简单的隔离性。没有复杂的隔离级别。

  • 这组命令的执行结果是被写入到内存的,是否持久取决于 Redis 的持久化策略,与事务无关。

Redis事务实现

Redis 事务通过三个命令进行控制。

  • multi:开启事务

  • exec:执行事务

  • discard:取消事务

exec和discard这两个命令只能在开启事务后执行一个,有你没我,有我没你。

Redis事务异常处理

语法错误

当事务中的命令出现语法错误时,整个事务在 exec 执行时会被取消。exec 之后的提示是 exec 被忽略,事务被取消,因为之前的错误。

执行异常

​ 如果事务中的命令没有语法错误,但在执行过程中出现异常,该异常不会影响其它命令的执行。该异常并不会影响其前后命令的正确执行。

Redis事务隔离机制

Redis 通过 watch 命令再配合事务实现了多线程下的执行隔离。
在这里插入图片描述
在这里插入图片描述
其实现原理为:

  1. 当某一客户端对 key 执行了 watch 后,系统就会为该 key 添加一个 version 乐观锁,并初始化 version。例如初值为 1.0。这时候就会记录这个版本在缓存中。
  2. 此后客户端 C 右对该 key 的值进行了修改,这个修改不仅修改了 key 的 value 本身,同时也增加了 version 的值,例如使其 version 变为了 2.0,并将该 version 记录到了该 key信息中。
  3. 此后客户端 C 左执行 exec,开始执行事务中的命令。不过,其在执行到对该 key 进行修改的命令时,该命令首先对当前客户端缓存中保存的 version 值与当前 key 信息中的version 值。如果缓存 version 小于 key 的 version,则说明客户端缓存的 key 的 value 已经过时,该写操作如果执行可能会破坏数据的一致性。所以该写操作不执行。

注意:一但执行 EXEC 开启事务的执行后,无论事务使用执行成功, WARCH 对变量的监控都将被取消。故当事务执行失败后,需重新执行WATCH命令对变量进行监控,并开启新的事务进行操作。

​ watch后无论是自己客户端改了之后还是别的客户端改了都会改变其版本,在事务执行的时候都会进行对比,比较的就是watch时的版本,发现不一致就不执行了。
在这里插入图片描述

UNWATCH 命令可以手动取消对所有键的监视

当客户端断开连接时,该客户端对键的监视也会被取消。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值