Redis单条命令式保存原子性的,但是事务不保证原子性!

Redis事务本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程的中,会按照顺序执行

所有的命令在事务中,并没有直接被执行!只有发起执行命令的时候才会执行!Exec的时候,操作像是在压栈一样

Redis事务没有没有隔离级别的概念,所以不会存在脏读幻读重复读

三个特性:

一次性、顺序性、排他性

事务执行流程

1.开启事务==》multi
2.命令入队
3.提交事务==》exec

127.0.0.1:6379> multi  #开启事务
OK
#命令入队
127.0.0.1:6379> set key1 1
QUEUED
127.0.0.1:6379> set key2 2
QUEUED
127.0.0.1:6379> get key1
QUEUED
127.0.0.1:6379> set key3 3
QUEUED
127.0.0.1:6379> exec  #执行事务
1) OK
2) OK
3) "1"
4) OK

这儿分两个异常:

1.编译型异常(代码有问题!命令有错! ),事务中所有的命令都不会被执行!
整个事务里面的操作都不会被执行

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> exec  #执行事务报错!
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k4  #所有的命令都不会被执行!
(nil)

运行时异常(1/0),如果事务队列中存在语法性,那么执行命令的时候,其他命令是可以正常执行的
错误命令抛出异常!

127.0.0.1:6379> set k1 v1
OK
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"

所以事务没有原子性

watch

watch本身就是乐观锁
悲观锁
很悲观,认为什么时候都会出问题,无论做什么都会加锁
乐观锁:
很乐观,认为什么时候都不会出问题,所以不会上锁!更新数据的时候去判断一下,在此期间是否有人修改过这个数据,获取version,更新的时候比较version,这种涉及到ABA问题

#正常执行成功
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
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
#线程2修改了money再提交
#执行之前,另外一个线程,修改了我们的值,这个时候,就会导致事务执行失败
127.0.0.1:6379> EXEC
(nil)
############################
#线程2
127.0.0.1:6379> get money
"80"
127.0.0.1:6379> set money 1000  #修改了钱为1000
OK
###########################
#执行失败会自动解锁,然后再加锁,就是watch,重新监视,重新提交事务

ABA问题不会存在

测试多线程修改值,使用watch可以当做redis的乐观锁操作!

Redis中的事务和watch(乐观锁)相关推荐

  1. Redis实战 - 15 Redis事务机制和乐观锁实现

    文章目录 1. Redis事务简介 2. Redis事务的操作命令 3. Redis的事务回滚 4. Redis监控事务 1. Redis事务简介 在 Redis 中,也存在多个客户端同时向 Redi ...

  2. Redis初学:14(Redis中的事务)

    Redis中的事务 Redis的事务定义 Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断. Redis事务的主 ...

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

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

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

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

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

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

  6. Redis 解决事务冲突之乐观锁和悲观锁

    文章目录 一.Redis的事务冲突问题 二.悲观锁 三.乐观锁 四.乐观锁的使用 五.Redis 事务三特性 一.Redis的事务冲突问题 例子: 比如说,3个人有你的账户:你有10000元 一个人请 ...

  7. 如何理解Redis中的事务

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

  8. Redis的事务和锁机制(乐观锁和悲观锁)

    Redis学习笔记(四) 1,Redis事务的定义 2,Redis事务操作的三个基本命令 3,解决Redis中的事务冲突(乐观锁和悲观锁) 3.1,悲观锁 3.2,乐观锁 3.3,Redis中使用乐观 ...

  9. Redis中五大基本数据类型和三种特殊数据类型详解

    目录 介绍 概念 基本命令 redis是单线程的 五大基本数据类型 String 命令 应用场景 List 命令 应用场景 Set 命令 应用场景 Hash 命令 应用场景 Zset 命令 应用场景 ...

最新文章

  1. Java项目:(前端vue后台java微服务)在线考试系统(java+vue+springboot+mysql+maven)
  2. ​CPU将进入新时代:押注计算芯片的极限协同设计
  3. 教务处管理系统c语言编程,基于C语言的教务管理系统的设计
  4. Ocr技术 识别高级验证码
  5. C++const与#define 相比,有何优点?
  6. 创建yum存储库;文件目录下存RPM包,不挂载镜像,不使用外网yum源;
  7. 【JavaScript】JS事件机制学习
  8. 支付系统设计:支付系统的账户模型(一)
  9. 查看总耗时_吉林德惠电力施工总承包资质代办
  10. android联系人源码分析,android 联系人源码分析 新字段的添加流程
  11. Linux/AIX上部署VNC Server
  12. 深度优先遍历(DFS)例题
  13. kindeditor上传图片编辑框乱码问题
  14. 006-深度学习与NLP简单应用
  15. 计算机控制键有哪些,常用的电脑快捷键大全有哪些
  16. sd卡格式化怎么恢复?
  17. (vcom-1141) Identifier “<protected>“ does not identify a component declaration.
  18. 粮仓分布式多点测温的简单参考方案
  19. 论文投稿指南——中文核心期刊推荐(机械、仪表工业)
  20. js实现全屏与退出全屏,解决F11进入全屏后退出全屏API方法失效(chrome)

热门文章

  1. 67 SD配置-交货凭证配置-分配 SD 查找过程/激活检查
  2. python好用的第三方库_非常有用的 Python 第三方库
  3. php json 压缩传输,php json数据使用gzip压缩输出
  4. 面向对象的特征有哪些方面?
  5. python 上传excel_简历批量合并Python+VBA小工具
  6. 百度统计:网站统计实时访客报告
  7. 本地运行vue.js项目,如何更改调试的默认端口?
  8. 轻量小巧的Knife4j v2.0.8源码
  9. 苹果cms V10模板 秘趣响应式高端在线影视视频模板
  10. centos mysql导出数据库命令_在centos(linux)下用命令导出mysql数据库数据