Redis中的事务

Redis的事务定义

Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用就是串联多个命令防止别的命令插队。

Redis中的事务操作Multi、Exec、discard

从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis会将之前的命令队列中的命令依次执行。组队的过程中可以通过discard来放弃组队。

事务的错误处理

案例:
1.组队成功,提交成功,如下图:

2.组队阶段语法错误,提交失败事务不进行回滚,如下图:

在开启事务之后,将key1的值从value1修改成value11,key2改成value22,key3改成value33,但由于key2处语法错误,导致事务提交失败,key1、key2和key3保持原值。

3.在组队阶段出现运行时错误,事务并没有进行回滚,而是跳过错误内容继续执行,如下图:

在开启事务之后,将key1的值从value1修改成value11,key2改成value22,key3改成value33,但将key2的类型作为List,在运行时检测类型错误,最终导致事务提交失败。此时事务并没有回滚,而是跳过错误命令继续执行, 结果key1和key3的值改变、key2保留原值。

4.使用discard命令取消组队,如下图:

在上图中开启事务之后,执行了一系列的操作后使用discard命令,放弃组队,前面的操作都没有执行。

综上,我们可以得出下列结论
1.组队中某个命令出现了报告错误(语法错误、编译错误),执行时整个的所有队列都会被取消,如下图:
2.如果执行阶段某个命令报出了错误(运行时错误),则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚,如下图:

事务冲突问题

悲观锁


悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。

悲观锁主要分为共享锁和排他锁:
**共享锁(shared locks)**又称为读锁,简称 S 锁。顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
**排他锁(exclusive locks)**又称为写锁,简称 X 锁。顾名思义,排他锁就是不能与其他锁并存,如果一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁。获取排他锁的事务可以对数据行读取和修改。

乐观锁


乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。

乐观锁的实现:
1.CAS 实现:Java 中java.util.concurrent.atomic包下面的原子变量使用了乐观锁的一种 CAS 实现方式。
2.版本号控制:一般是在数据表中加上一个数据版本号 version 字段,表示数据被修改的次数。当数据被修改时,version 值会 +1。当线程 A 要更新数据时,在读取数据的同时也会读取 version 值,在提交更新时,若刚才读取到的 version 值与当前数据库中的 version 值相等时才更新,否则重试更新操作,直到更新成功。

Redis中的事务冲突问题解决

watch

使用:

watch key1 key2 ...

在执行multi之前,先执行watch key1 [key2],可以监视一个(或多个) key ,如果在事务执行之前这个(或这些)key 被其他命令所改动,那么事务将被打断。

例:
我在两个不同的终端进行操作示范
终端1:

终端2:

上图中终端1和终端2的执行过程几乎是一致的,都是从watch开始执行,但是终端2执行exec命令时表示执行失败,这是因为终端1先与终端2执行了对balance的修改操作,导致终端2的事务被打断了。

unwatch

使用:

unwatch key1 key2 ...

取消 WATCH 命令对所有 key 的监视。
如果在执行 WATCH 命令之后,EXEC 命令或DISCARD 命令先被执行了的话,那么就不需要再执行UNWATCH 了。

Redis事务的三大特性

  • 单独的隔离操作
    事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  • 没有隔离级别的概念
    队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行
  • 不保证原子性
    事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

Redis初学:14(Redis中的事务)相关推荐

  1. 【Redis】14.Redis高级数据类型Bitmaps、HyperLogLog、GEO

    [Redis]14.Redis高级数据类型Bitmaps.HyperLogLog.GEO Bitmaps:用比特位进行快速的状态统计 Bitmaps基本操作 Bitmaps不是一个新的数据类型,而是s ...

  2. Redis 实战 —— 14. Redis 的 Lua 脚本编程

    简介 Redis 从 2.6 版本开始引入使用 Lua 编程语言进行的服务器端脚本编程功能,这个功能可以让用户直接在 Redis 内部执行各种操作,从而达到简化代码并提高性能的作用. P248 在不编 ...

  3. redis中的事务、lua脚本和管道的使用场景

    https://blog.csdn.net/fangjian1204/article/details/50585080 事务 redis中的事务并不像mysql中那么完美,只是简单的保证了原子性.re ...

  4. Redis系列之key操作命令与Redis中的事务详解(六)

    From: http://www.cnblogs.com/knowledgesea/p/5008594.html 序言 本篇主要目的有二: 1.展示所有数据类型中key的所有操作命令,以供大家学习,查 ...

  5. 如何理解Redis中的事务

    1.Redis事务 Redis的事务是通过multi.exec.discard和watch这四个命令来完成的. Redis的单个命令都是原子性的,所以这里需要确保事务性的对象是命令集合. Redis将 ...

  6. 【Sofice小司笔记】4 Redis,包含nosql,redis架构,8中数据类型,事务,持久化,配置文件详解,发布订阅,集群管理,缓存穿透和雪崩

    NoSQL 关系型数据库存在的问题: 网站的用户并发性非常高,往往达到每秒上万次读写请求,对于传统关系型数据库来说,硬盘 I/O 是一个很大的瓶颈 网站每天产生的数据量是巨大的,对于关系型数据库来说, ...

  7. 【承】Redis 原理篇——关于 Redis 中的事务

    前言 关于 Redis 的"起承转合",我前面已经用五个篇章的长度作了一个 Redis 基础篇--"起"篇的详细阐述,相信大家无论之前有没有接触过 Redis, ...

  8. Redis 集群规范(中文稿)(MOVED错误码及ASK错误码

    引言? 这个文档是正在开发中的 Redis 集群功能的规范(specification)文档,文档分为两个部分: 第一部分介绍目前已经在 unstable 分支中实现了的那些功能. 第二部分介绍目前仍 ...

  9. 14 Redis 保存时间序列数据

    14 Redis 保存时间序列数据 前言 一.时间序列数据的读写特点 二.基于 Hash 和 Sorted Set 保存时间序列数据 三.基于 RedisTimeSeries 模块保存时间序列数据 总 ...

最新文章

  1. 学python多长时间能够精通-Python培训需要多长时间可以学会?
  2. 高并发编程-happens-before
  3. 路由系统(urls.py)
  4. HDU 1317 XYZZY(floyd+bellman_ford判环)
  5. Error encountered when performing Introspect schema xxx 错误的解决方法
  6. mysql goldengate_oracle GoldenGate实现Oracle到MySQL数据平滑迁移
  7. 【数据结构】——排序算法系列总结
  8. 可隐藏选项卡html,隐藏HTML中选定选项卡的底部边框
  9. HTML+CSS+JS实现月球上行走的宇航员网页设计
  10. 文字超过省略_纯CSS实现“文本溢出截断省略”的几种方法
  11. crm高速开发之EntityCollection
  12. vim移动一行或一段代码
  13. C++类中静态变量和静态方法使用介绍!
  14. jQuery blockUI 使用详解
  15. arduino连接ps2手柄控制智能小车实践记录-续
  16. 江娱互动:游戏领域 Serverless 架构探索之路
  17. 实用selenium+python实现web自动化测试
  18. Flash MX as 声音控制分解
  19. 戴尔出厂映像还原选项在Windows恢复丢失
  20. 蚊子凭啥只咬你?科学家用 5 年造出一批“脑子发光”的蚊子,终于搞懂背后机制

热门文章

  1. 【实用快捷键】设置WebStorm中Show in Explorer(在资源管理器中打开)快捷键Alt+Shift+R(类似VSCode)
  2. 实验四 定位与导航算法
  3. ATS插件channel_stats源码分析解读
  4. NVME CLI -- nvme 命令查看NVME设备内部状态
  5. 分布式存储(ceph)技能图谱(持续更新)
  6. 二分法:search insert position 插入位置
  7. C语言网络编程:bind函数详解
  8. Java和.NET使用DES对称加密的区别
  9. C#杂记系列之日期函数
  10. Shark Hive Spark Hadoop2 进行整合的测试。