【Redis】Redis 事务

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

1.事务特性

        仅保证了数据的一致性

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

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

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

2.事务实现

     2.1.三个命令

        1)muti:开启事务

        2)exec:执行事务

        3)discard:取消事务

     2.2.基本使用

        定义并执行事务:

        799990d9d51446c88b8e7b9966796e31.png

        定义并取消事务:

         5632fe37db2541af9ed2927251c37c5b.png

3.事务异常处理

     3.1.语法错误

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

4c9677e2087146b2856fe89f8d4821a4.png135a1444e6f7456fa20ee7ffcdbe4e3a.png

     3.2.执行异常

        如果事务中的命令没有语法错误,但执行过程中出现异常,该异常不会影响其它命令的执行

4.事务隔离机制

        在并发场景下可能会出现多个客户端对同一个数据进行修改的情况,为了解决这种情况,事务通过乐观锁机制实现了多线程下的执行隔离

     4.1.隔离的实现

        通过 watch 命令再配合事务实现了多线程下的执行隔离

     4.2.实现原理

        1)当某一客户端对 key 执行了 watch 后,系统就会为该 key 添加一个 version 乐观锁,并 初始化 version。例如初值为 1.0

        2)客户端 A 将对该 key 的修改语句写入到了事务命令队列中,虽未执行,但其将该 key 的 value 值与 version 进行了读取并保存到了当前客户端缓存。此时读取并保存的是 version 的初值 1.0

        3)客户端 B 对该 key 的值进行了修改,这个修改不仅修改了 key 的 value 本身,同时也增加了 version 的值,例如使其 version 变为了 2.0,并将该 version 记录到了该 key 信息中

        4)客户端 A 执行 exec,开始执行事务中的命令。不过,其在执行到对该 key 进行修改的命令时,该命令首先对当前客户端缓存中保存的 version 值与当前 key 信息中的 version 值。如果缓存 version 小于 key 的 version,则说明客户端缓存的 key 的 value 已经过时,该写操作如果执行可能会破坏数据的一致性。所以该写操作不执行

        

        

 

相关推荐

  1. #Django事务#

    2024-05-12 06:50:04       38 阅读
  2. 数据库事务

    2024-05-12 06:50:04       35 阅读
  3. sql<span style='color:red;'>事务</span>

    sql事务

    2024-05-12 06:50:04      43 阅读
  4. Mysql(事务

    2024-05-12 06:50:04       53 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-12 06:50:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-12 06:50:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-12 06:50:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-12 06:50:04       20 阅读

热门阅读

  1. 整理项目中经常用到的正则

    2024-05-12 06:50:04       7 阅读
  2. word内容wxml转化html标签对照表

    2024-05-12 06:50:04       13 阅读
  3. Golang reflect.MakeFunc() 的用法及示例

    2024-05-12 06:50:04       10 阅读
  4. 软件定义汽车七大典型应用场景

    2024-05-12 06:50:04       10 阅读
  5. react18封装公共请求函数

    2024-05-12 06:50:04       10 阅读
  6. NLP和chatGpt的关系

    2024-05-12 06:50:04       9 阅读
  7. Bert基础(二十二)--Bert实战:对话机器人

    2024-05-12 06:50:04       10 阅读
  8. 【网络】为什么TCP需要四次挥手?

    2024-05-12 06:50:04       8 阅读
  9. Emmy load workspace 排除一些目录

    2024-05-12 06:50:04       9 阅读