文章目录

  • 1 Redis 事务的定义
  • 2 Multi、exec、discard
    • 2.1 multi 开启事务,exec 提交事务
    • 2.2 multi 开启事务,discard放弃事务
  • 3 事务的错误处理
    • 3.1 组队中出现了错误
    • 3.2 执行时出现了错误
  • 4 事务冲突的问题
    • 4.1 乐观锁
    • 4.2 悲观锁
    • 4.3 Watch key
      • 4.3.1 乐观锁案例
  • 5 事务的三个特性
    • 5.1 单独的隔离操作
    • 5.2 没有隔离级别的概念
    • 5.3 不保证原子性

1 Redis 事务的定义

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

Redis 事务的主要作用就是串联多个命令防止别的命令插队。

2 Multi、exec、discard

从multi 命令开始,输入的命令都会依次进入命令队列中,但不会执行,知道输入exec后,redis会将之前的命令队列中的命令依次执行。

组队的过程中可以通过discard 来放弃组队。

2.1 multi 开启事务,exec 提交事务

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set key1 value1
QUEUED
127.0.0.1:6379(TX)> set key2 value2
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK
127.0.0.1:6379>

2.2 multi 开启事务,discard放弃事务

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set a1 v1
QUEUED
127.0.0.1:6379(TX)> set a2 v2
QUEUED
127.0.0.1:6379(TX)> discard
OK
127.0.0.1:6379> 

3 事务的错误处理

3.1 组队中出现了错误

组队中某个命令出现了错误,执行时整个队列都会被取消。

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set b1 v1
QUEUED
127.0.0.1:6379(TX)> set b2 v2
QUEUED
127.0.0.1:6379(TX)> set b3
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get b1
(nil)
127.0.0.1:6379> 

3.2 执行时出现了错误

如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,其他命令都会执行,不会回滚。

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set c1 v1
QUEUED
127.0.0.1:6379(TX)> incr c1
QUEUED
127.0.0.1:6379(TX)> set c2 v2
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
127.0.0.1:6379>

4 事务冲突的问题

4.1 乐观锁

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

4.2 悲观锁

悲观锁(Pessimistic Lock) 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次拿数据的时候都会上锁,这样别人想拿这个数据就会block(阻塞)直到它拿到锁。传统的关系型数据库里面就用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在操作之前先上锁。

4.3 Watch key

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

4.3.1 乐观锁案例

开启两个事务,watch监视同一个key,第一个事务执行完成后,第二个key执行会失败。

先在第一个客户端设置一个key为blance

127.0.0.1:6379> set blance 100
OK
127.0.0.1:6379> keys *1) "c1"2) "key2"3) "VerifyCode18771105555:count"4) "key1"5) "names"6) "china"7) "c2"8) "sname"9) "k1"
10) "k2"
11) "blance"
12) "name"
13) "user"
14) "k11"

在第二个客户端也可以看到这个key

127.0.0.1:6379> keys *1) "c1"2) "key2"3) "VerifyCode18771105555:count"4) "key1"5) "names"6) "china"7) "c2"8) "sname"9) "k1"
10) "k2"
11) "blance"
12) "name"
13) "user"
14) "k11"

两个客户端同时开启watch监控balance 这个key,并同时开启事务

127.0.0.1:6379> watch balance
OK
127.0.0.1:6379> multi
OK

在第一个客户端对balance进行自加10并执行事务,成功

127.0.0.1:6379(TX)> incrby balance 10
QUEUED
127.0.0.1:6379(TX)> exec
1) (integer) 10
127.0.0.1:6379> 

在第二个客户端对balance进行自加20 并执行事务,失败

127.0.0.1:6379(TX)> incrby balance 20
QUEUED
127.0.0.1:6379(TX)> exec
(nil)
127.0.0.1:6379> 

因为在第二客户端执行时,version版本已经被第一个客户端更新,所以失败。

5 事务的三个特性

5.1 单独的隔离操作

事务中的所有命令都会序列化、按顺序执行。事务在执行过程中,不会被其他客户端发送来的命令请求所打断。

5.2 没有隔离级别的概念

队列中的命令没有提交之前都不会实际被执行,因为事务提交之前任何指令都不会被被实际执行。

5.3 不保证原子性

事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。

7 Redis 事务相关推荐

  1. redis学习之——Redis事务(transactions)

    Redis事务:可以一次执行多个命令,本质是一组命令的集合.一个事务中的,所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞. 常用命令:MULTI  开启事务  EXEC 提交事务 ...

  2. 腾讯二面:Redis 事务支持 ACID 么?

    ❝ 腾讯面试官:「数据库事务机制了解么?」 「内心独白:小意思,不就 ACID 嘛,转眼一想,我面试的可是技术专家,不会这么简单的问题吧」 程许远:「balabala-- 极其自信且从容淡定的说了一通 ...

  3. 图解Redis事务机制

    来自:Java中文社群 作为关系型数据库中一项非常重要的基础功能--事务,在 Redis 中是如何处理并使用的? 1.前言 事务指的是提供一种将多个命令打包,一次性按顺序地执行的机制,并且保证服务器只 ...

  4. 【带你重拾Redis】Redis事务

    Redis事务 Redis的事务主要依赖于WATCH ,UNWATCH,MULTI , EXEC, DISCARD等命令. 其中 MULTI , EXEC , DISCARD 分别对应关系型数据库的 ...

  5. redis中有key但是删不掉_一篇图文,搞定Redis事务

    在面试的时候,通常会被问到redis是如何实现分布式锁的.如果我们只知道是借助于setnx/setex ,而不了解setnx/setex底层如何实现,那基本上是无法过关的,尤其是大厂.那究竟redis ...

  6. Redis事务和watch

    redis的事务 严格意义来讲,redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的. redis中的事务定义 Redis中的事务(transaction)是一组命令的集合. 事务同 ...

  7. 十七、Redis事务

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

  8. Redis - 事务

    一.概述 和传统关系型数据库一样,Redis 同样是支持事务的.Redis 的事务可以通过 MULTI/EXEC/DISCARD/WATCH 等命令来实现. 二.事务的 ACID 特性 1). 原子性 ...

  9. python redis事务_python redis事务源码及应用分析

    在多个客户端同时处理相同的数据时,不谨慎的操作很容易导致数据出错.一般的关系型数据库中有事务保证了数据操作的原子性,同样Redis中也设置了事务,可以理解为"将多个命令打包,然后一次性.按顺 ...

  10. Redis事务(transaction)

    Redis事务(transaction) 本文档翻译自: http://redis.io/topics/transactions . MULTI . EXEC . DISCARD 和 WATCH 是 ...

最新文章

  1. centos6.5 mysql 远程访问_centos6.5 mysql 设置支持远程ip访问
  2. Comet oj比赛组队
  3. python使用什么来表示不同级别的语句块-python通过什么来区分不同的语句块?
  4. 在EA中画ER图和数据模型图
  5. 【Chocolatey】安装python3
  6. 大型开发项目中 git 工作流的最佳实践
  7. 特征点提取算法 - 01 - 特征的定义基础
  8. Bootstrap报错:Bootstrap's JavaScript requires jQuery
  9. HttpRunnerManager(一)--安装
  10. 常用图像插值算法分析与比较
  11. iTOP4412 uboot移植教程
  12. 等价类划分法测试用例设计
  13. 元宇宙8大创业方向:虚拟偶像、数字孪生…
  14. 连载:面向对象葵花宝典:思想、技巧与实践(27) - 动态模型设计
  15. 25_深度学习_汇聚层
  16. alin42490怎样解除_最新版农药通用名称与CIPAC编号对照表
  17. MsysGIT -- Windows下GIT提供众多的Linux命令
  18. vin端口是什么意思_「每日一题」什么是 Web 服务器(server)
  19. awgn函数 matlab measure 什么意思,Matlab中 awgn 函数输入参数带有‘measured’ 时snr的含义...
  20. 博士后的那些套路,那些坑

热门文章

  1. python读取图片属性_[Python图像处理]三.获取图像属性及通道处理
  2. eset14 杀毒清除无提示
  3. python输出word内容_Django输出word文件(.doc),只在内容中显示原始html
  4. mysql 数据迁移_mysql实验--不同字符集数据库迁移步骤演示
  5. python的底层是c_python基本数据类型底层实现
  6. 安装百分之80卡住_新车买回来要不要安装发动机护板呢?装好还是不好?
  7. html框模型,4-2css中的框模型简介
  8. android背景图拉伸,Android使背景图像不拉伸它指定的视图_android_开发99编程知识库...
  9. mysql 员工工资上涨5%_工资从1万到3万,你还差mysql数据库优化之系列五
  10. Towards a topological-geometrical theory of group equivariant non-expansive operators for data analy