事务

Redis事务本质

  1. 一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行的过程中,会按照顺序执行
  2. 性质:一次性 顺序性 排他性

-------- 队列 set set set 执行 --------

  1. Redis事务中没有隔离级别的概念

所有的命令在事务中,并没有直接被执行,只有发起执行命令的时候才会执行:exec
所以不会出现幻读 脏读等

  1. Redis的单条命令是保证原子性的,但Redis的事务是不保证原子性

Redis事务

  1. 开启事务(multi)
  2. 命令入队(…其他命令…)
  3. 执行事务(exec)
    Redis可以使用watch来实现乐观锁

    入队的时候并没有去执行,而是调用了执行命令exec之后按照入队的顺序去执行
# 正常执行事务 exec
127.0.0.1:6379> multi                        # 开启事务
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379> exec                     # 执行事务
1) OK
2) OK
3) OK
4) "v1"
5) "v2"# 放弃事务 discard
127.0.0.1:6379> multi                        # 再开启一个事务
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> discard                      # 放弃执行事务
OK
127.0.0.1:6379> get k4                       # 由于放弃了事务,没有执行,所以拿不到k4
(nil)# 编译型异常(代码有问题,命令有错)事务中所有的命令都不能执行
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> getset k3                    # 错误的命令
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> set k5 v5
QUEUED
127.0.0.1:6379> exec                     # 执行事务报错
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k5
(nil)
127.0.0.1:6379> get k1
(nil)# 运行时异常(如:1/0),如果队列中存在语法性错误,那么执行命令的时候,其他命令可以正常执行,错误命令会抛出异常
127.0.0.1:6379> multi                        # 开启新事务
OK
127.0.0.1:6379> incr k1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> get k3
QUEUED
127.0.0.1:6379> exec                     # 执行命令:有错误的会抛出,没有错误的会继续执行
1) (error) ERR value is not an integer or out of range      # 虽然第一条命令失败,但依旧正常执行以后的命令
2) OK
3) OK
4) "v3"
127.0.0.1:6379> get k2                       # 可以执行
"v2"
127.0.0.1:6379> get k3                       # 可以执行
"v3"

监控 Watch

悲观锁

很悲观,认为什么时候都会出问题,无论做什么都会加锁

乐观锁(watch本身就是乐观锁)

  1. 很乐观,认为什么时候都不会出问题,所以不会上锁。更新数据的时候去判断一下,在此期间是否有人修改过这个数据
  2. 获取version
  3. 更新的时候比较version

Redis监视测试(watch可以用来实现 悲观锁 乐观锁)

一旦事务执行成功,监视就会自动解除

  1. 正常执行成功
# 单线程模拟
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money                      # 监视money对象
OK
127.0.0.1:6379> multi                            # 事务正常结束,数据期间没有发生变动,这个时候就正常执行成功
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> incrby out 20
QUEUED
127.0.0.1:6379> exec
1) (integer) 80
2) (integer) 20
  1. 测试多线程
# 保留原始终端A,新开一个终端B
127.0.0.1:6379> watch money                      # 监视money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 10
QUEUED
127.0.0.1:6379> incrby out 10
QUEUED# 先不执行命令# 终端A
127.0.0.1:6379> get money
"80"
127.0.0.1:6379> set money 1000                   # 在终端A中修改money的值
OK# 终端B
127.0.0.1:6379> exec                         # 在终端B中执行事务(不会成功,因为money已经被修改了)
(nil)# 解锁
127.0.0.1:6379> unwatch                          # 解锁
OK
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> decrby money 10
(integer) 990
127.0.0.1:6379> incrby out 10
(integer) 30

如果修改失败,获取新的值

【狂神说Redis】5 事务相关推荐

  1. 狂神说 redis 笔记

    Nosql概述 为什么要学Nosql 我们先在处于大数据时代,大数据一般的数据库无法进行分析处理了!2006 Hadoop 压力一定会越来越大,适者生存!一定要逼着自己学习,这是在这个社会生存的唯一法 ...

  2. 狂神说Redis笔记

    以下是狂神Redis笔记,个人觉得总结的很好,故收藏一下,日后再总结一下自己的笔记 ⭐学习时间2022.1.4-2022.1.6 一.Nosql概述 为什么使用Nosql 1.单机Mysql时代 90 ...

  3. Redis中事务的实现流程

    场景 Centos中Redis的下载编译与安装(超详细): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103967334 Re ...

  4. Redis的事务:相关命令 watch 与mysql事务的区别

    Redis事务的概念: Redis 事务的本质是一组命令的集合. 事务支持一次执行多个命令,一个事务中所有命令都会被序列化.在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不 ...

  5. redis的事务总结

    结论 1. redis的事务几乎没什么用,只能在单节点情况下,保证一下顺序性,原子性(只是事务执行时不会被插入其他的命令,并不是真正的原子性) 2. redis的事务无法回滚,无论发生什么错误,都无法 ...

  6. Redis之Redis的事务

    1.Redis的事务是什么 Redis 事务的本质是一组命令的集合,事务支持一次执行多个命令,一个事务中所有命令都会被序列化.(redis事务就是一次性.顺序性.排他性的执行一个队列中的一系列命令). ...

  7. Redis 实用技术——事务

    引言 redis的事务不像关系型数据库的事务那样完整. "快"是redis的特征,在事务管理的过程中,使用muti命令开启事务块,当输入多条命令后,再使用exec命令执行事务块中的 ...

  8. redis的事务不是原子性

    一.事务的四大特性 关系型数据库的事务具有四个特性: 1. 原子性 2. 一致性 3. 隔离性 4. 持久性 二.而在我们redis数据库中,事务回事什么样子的呢? 首先我们给出一个定义:redis的 ...

  9. mysql 事务回滚_简短截说阐述redis中事务的使用

    我们知道,在关系型数据库中,比如mysql,如果要使用事务,首先向数据库服务器发送 BEGIN ,然后执行各个相互一致的写操作和读操作,最后,用户可以选择发送 COMMIT 来确认之前所做的修改,或者 ...

  10. Redis——Redis的事务

    Redis的事务 事务简介 事务基本操作 事务的工作流程 事务的注意事项 锁 基于特定条件的事务执行 分布式锁 死锁 事务简介 事务是一个数据库必备的元素,对于redis也不例外,对于一个传统的关系型 ...

最新文章

  1. Redis 笔记(16)— info 指令和命令行工具(查看内存、状态、客户端连接数、监控服务器、扫描大key、采样服务器、执行批量命令等)
  2. matlab仿真谱间干扰,内外分解和谱分解问题解析计算及其MATLAB仿真.pdf
  3. Linux Socket编程的一些总结
  4. MyBatis的foreach语句详解
  5. bootstrap-模态框
  6. 核心对象+持久对象全析(3)
  7. SU插件情报局 | Selection Toys 过滤选择(附插件安装包)
  8. parted 对nvme盘进行分区
  9. arduino智能浇花系统_智能自浇花系统
  10. 推荐一个3D建模工具集
  11. JDKbin目录下的众多exe文件的用途
  12. 红宝书背诵笔记 — 简单基础词语,Java视频教程百度网盘
  13. Hp电脑测试软件还是硬件问题,惠普硬件怎么检测
  14. OpenSSL公钥 私钥 RSA
  15. 微信公众号开发(1)
  16. nodejs和npm版本升级
  17. 【吐槽脑洞】关于逛B站时偶然体验的弹幕互动游戏魏蜀吴三国争霸游戏的一些思考
  18. 星巴克猫爪杯开售遭哄抢 淘宝同款比比皆是真假难辨
  19. Hive hql 经典5道面试题
  20. 【大咖专栏】如何配置CEPH RGW对象存储与公有云同步

热门文章

  1. 迄今以来在硅谷的最大押注:摩根大通雇超千人专注金融科技
  2. Valve员工手册,一部震惊世界的“人生攻略”
  3. 阿里架构师首次畅谈余额宝背后的故事
  4. (转)比特币基金难产 区块链基金成首发
  5. 重磅!解读国内唯一入选全球顶会SIGCOMM的阿里云网络论文
  6. 可信开发技术专家---阿里云诚聘
  7. 【机械仿真】基于matlab GUI 汽车悬架(钢板弹簧+减震器)设计【含Matlab源码 1631期】
  8. 【火灾检测】基于matlab连通区域+SVM特征融合火灾检测【含Matlab源码 1223期】
  9. 【运动学】基于matlab匀变速直线运动规律【含Matlab源码 978期】
  10. 【图像隐写】基于matlab LDPC编码译码改进DCT水印嵌入提取【含Matlab源码 832期】