【狂神说Redis】5 事务
事务
Redis事务本质
- 一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行的过程中,会按照顺序执行
- 性质:一次性 顺序性 排他性
-------- 队列 set set set 执行 --------
- Redis事务中没有隔离级别的概念
所有的命令在事务中,并没有直接被执行,只有发起执行命令的时候才会执行:exec
所以不会出现幻读 脏读等
- Redis的单条命令是保证原子性的,但Redis的事务是不保证原子性的
Redis事务
- 开启事务(multi)
- 命令入队(…其他命令…)
- 执行事务(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本身就是乐观锁)
- 很乐观,认为什么时候都不会出问题,所以不会上锁。更新数据的时候去判断一下,在此期间是否有人修改过这个数据
- 获取version
- 更新的时候比较version
Redis监视测试(watch可以用来实现 悲观锁 乐观锁)
一旦事务执行成功,监视就会自动解除
- 正常执行成功
# 单线程模拟
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
- 测试多线程
# 保留原始终端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 事务相关推荐
- 狂神说 redis 笔记
Nosql概述 为什么要学Nosql 我们先在处于大数据时代,大数据一般的数据库无法进行分析处理了!2006 Hadoop 压力一定会越来越大,适者生存!一定要逼着自己学习,这是在这个社会生存的唯一法 ...
- 狂神说Redis笔记
以下是狂神Redis笔记,个人觉得总结的很好,故收藏一下,日后再总结一下自己的笔记 ⭐学习时间2022.1.4-2022.1.6 一.Nosql概述 为什么使用Nosql 1.单机Mysql时代 90 ...
- Redis中事务的实现流程
场景 Centos中Redis的下载编译与安装(超详细): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103967334 Re ...
- Redis的事务:相关命令 watch 与mysql事务的区别
Redis事务的概念: Redis 事务的本质是一组命令的集合. 事务支持一次执行多个命令,一个事务中所有命令都会被序列化.在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不 ...
- redis的事务总结
结论 1. redis的事务几乎没什么用,只能在单节点情况下,保证一下顺序性,原子性(只是事务执行时不会被插入其他的命令,并不是真正的原子性) 2. redis的事务无法回滚,无论发生什么错误,都无法 ...
- Redis之Redis的事务
1.Redis的事务是什么 Redis 事务的本质是一组命令的集合,事务支持一次执行多个命令,一个事务中所有命令都会被序列化.(redis事务就是一次性.顺序性.排他性的执行一个队列中的一系列命令). ...
- Redis 实用技术——事务
引言 redis的事务不像关系型数据库的事务那样完整. "快"是redis的特征,在事务管理的过程中,使用muti命令开启事务块,当输入多条命令后,再使用exec命令执行事务块中的 ...
- redis的事务不是原子性
一.事务的四大特性 关系型数据库的事务具有四个特性: 1. 原子性 2. 一致性 3. 隔离性 4. 持久性 二.而在我们redis数据库中,事务回事什么样子的呢? 首先我们给出一个定义:redis的 ...
- mysql 事务回滚_简短截说阐述redis中事务的使用
我们知道,在关系型数据库中,比如mysql,如果要使用事务,首先向数据库服务器发送 BEGIN ,然后执行各个相互一致的写操作和读操作,最后,用户可以选择发送 COMMIT 来确认之前所做的修改,或者 ...
- Redis——Redis的事务
Redis的事务 事务简介 事务基本操作 事务的工作流程 事务的注意事项 锁 基于特定条件的事务执行 分布式锁 死锁 事务简介 事务是一个数据库必备的元素,对于redis也不例外,对于一个传统的关系型 ...
最新文章
- Redis 笔记(16)— info 指令和命令行工具(查看内存、状态、客户端连接数、监控服务器、扫描大key、采样服务器、执行批量命令等)
- matlab仿真谱间干扰,内外分解和谱分解问题解析计算及其MATLAB仿真.pdf
- Linux Socket编程的一些总结
- MyBatis的foreach语句详解
- bootstrap-模态框
- 核心对象+持久对象全析(3)
- SU插件情报局 | Selection Toys 过滤选择(附插件安装包)
- parted 对nvme盘进行分区
- arduino智能浇花系统_智能自浇花系统
- 推荐一个3D建模工具集
- JDKbin目录下的众多exe文件的用途
- 红宝书背诵笔记 — 简单基础词语,Java视频教程百度网盘
- Hp电脑测试软件还是硬件问题,惠普硬件怎么检测
- OpenSSL公钥 私钥 RSA
- 微信公众号开发(1)
- nodejs和npm版本升级
- 【吐槽脑洞】关于逛B站时偶然体验的弹幕互动游戏魏蜀吴三国争霸游戏的一些思考
- 星巴克猫爪杯开售遭哄抢 淘宝同款比比皆是真假难辨
- Hive hql 经典5道面试题
- 【大咖专栏】如何配置CEPH RGW对象存储与公有云同步
热门文章
- 迄今以来在硅谷的最大押注:摩根大通雇超千人专注金融科技
- Valve员工手册,一部震惊世界的“人生攻略”
- 阿里架构师首次畅谈余额宝背后的故事
- (转)比特币基金难产 区块链基金成首发
- 重磅!解读国内唯一入选全球顶会SIGCOMM的阿里云网络论文
- 可信开发技术专家---阿里云诚聘
- 【机械仿真】基于matlab GUI 汽车悬架(钢板弹簧+减震器)设计【含Matlab源码 1631期】
- 【火灾检测】基于matlab连通区域+SVM特征融合火灾检测【含Matlab源码 1223期】
- 【运动学】基于matlab匀变速直线运动规律【含Matlab源码 978期】
- 【图像隐写】基于matlab LDPC编码译码改进DCT水印嵌入提取【含Matlab源码 832期】