1 基本说明

  可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化按顺序地串行化执行而不会被其他命令插入,不许加塞

2 事务相关的几个命令

2.1 MULTI

  标记一个事务块的开始 

redis> MULTI            # 标记事务开始
OK redis> INCR user_id # 多条命令按顺序入队
QUEUED redis> INCR user_id
QUEUED redis> INCR user_id
QUEUED redis> PING
QUEUED redis> EXEC # 执行
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG

2.2 EXEC

  执行事务内的所有命令

   

2.3 DISCARD

  取消事务,放弃执行事务块内的所有命令

  如果正在使用 WATCH 命令监视某个 key,那么取消所有监视,等同于执行命令 UNWATCH

redis> MULTI
OK redis> PING
QUEUED redis> SET greeting "hello"
QUEUED redis> DISCARD
OK

2.4 WATCH

  监视一个(或多个) key

  如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断(也就是隔离性)。

  事务执行完成,WATCH也结束了。

  watch指令,类似乐观锁,事务提交时,如果Key的值已经被别的客户端改变,比如某个list已经被别的客户端push/pop过了,整个事务队列都不会被执行

redis> WATCH lock lock_times
OK

2.5 UNCATCH

  取消 WATCH 命令对所有 key 的监视   

  如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了。

  因为 EXEC 命令会执行事务,因此 WATCH 命令的效果已经产生了,WATCH也就结束了;而 DISCARD 命令在取消事务的同时也会取消所有对 key 的监视,因此这两个命令执行之后,就没有必要执行 UNWATCH

3 关于MULTI事务的简要说明

  当我们开启一个事务的时候,输入一条条的指令。

  情况1:当某条命令格式没有问题,但是执行出错,比如incr k1,k1自增命令,如果k1不是数字,那么这条命令会报错。但是事务中这条命令之外的其他命令照样会执行(这条命令之前和之后的命令都会正常执行)。也就是说,在这种情况下,这些命令的执行并不是原子性执行的。

  情况2:当事务中某条命令格式就错误。那么事务中其他命令都不会执行。而在编码的角度来看的话,我们调用相关写方法,不会出现这个问题。

 

4 示例

1)正常执行

2)放弃事务

3)若在事务队列中存在语法错误,则执行EXEC命令时,所有命令都不会执行

4)若在事务队列中存在语法性错误(类似于java的1/0的运行时异常),则执行EXEC命令时,其他正确命令会被执行,错误命令抛出异常。

5)使用watch

  案例一:使用watch检测balance,事务期间balance数据未变动,事务执行成功


  

  案例二:使用watch检测balance,在开启事务后(标注1处),在新窗口执行标注2中的操作,更改balance的值,模拟其他客户端在事务执行期间更改watch监控的数据,然后再执行标注1后命令,执行EXEC后,事务未成功执行。

   新窗口

  一但执行 EXEC无论事务使用执行成功, WARCH 对变量的监控都将被取消。
  故当事务执行失败后,需重新执行WATCH命令对变量进行监控,并开启新的事务进行操作。

redis06-事务的更多相关文章

  1. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  2. SQLServer事务同步下如何收缩日志

    事务同步是SQLServer做读写分离的一种常用的方式. 随着业务数据的不断增长,数据库积攒了大量的日志,为了腾出硬盘空间,需要对数据库日志进行清理 订阅数据库的日志清理 因为订阅数据库所有的数据都来 ...

  3. 事务日志已满,原因为“ACTIVE_TRANSACTION”

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 异常处理汇总-数据库系列  http://www.cnblogs.com/dunitia ...

  4. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  5. Mysql事务探索及其在Django中的实践(一)

    前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...

  6. CRL快速开发框架系列教程七(使用事务)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  7. 玩转spring boot——结合JPA事务

    接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  8. MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  9. PHP中PDO事务的使用方法

    事务 (Transaction) 是操作数据库中很重要的一个功能, 它可以让你预定一条, 或者一系列 SQL 语句, 然后一起执行. 在执行的过程中, 如果其中的某条执行失败, 可以回滚所有已更改的操 ...

  10. Hibernate中事务的隔离级别设置

    Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下

随机推荐

  1. gin-k8s 运行的问题

    1,k8s admin dashboard项目地址:https://github.com/kubernetes/dashboard项目使用的是golang 作为后端,然后使用angular 作为前段框 ...

  2. Leetcode 799.香槟塔:动态规划+递归

    香槟塔:动态规划+递归 题目来源:Leetcode 22/11/20每日一题:799.香槟塔 https://leetcode.cn/problems/champagne-tower 我们把玻璃杯摆成 ...

  3. PostgreSQL和MySQL的优劣对比

    在开发项目的过程中,难免要面对选择数据库的情况.总结此文章是因为在之前公司里使用的都是MYSQL 数据库,而在现在公司里,新项目中使用的是 PostgreSQL 数据库,在使用过程中,经常需要查找两种 ...

  4. python 爬取豆瓣电影评论,并进行词云展示

    python 爬取豆瓣电影评论,并进行词云展示 本文旨在提供爬取豆瓣电影<我不是药神>评论和词云展示的代码样例 1.分析URL 2.爬取前10页评论 3.进行词云展示 1.分析URL 我不 ...

  5. Day34:BigDecimal的使用

    BigDecimal 在基本数据类型中对于浮点数的计算时会出现精度丢失的情况,这个时候我们采用BigDecimal类来解决精度丢失的问题. public class Test{ public stat ...

  6. python操作MySQL数据库连接(pymysql)

    目录 一:python操作MySQL 1.python如何操作MySQL? 2.什么是 PyMySQL? 二:PyMySQL 安装 1.方法一: 2.方法二: 三:pyMySQL模块基本使用 1.py ...

  7. cs231n__3. LostFunction

    CS231n 3.1 Lost Function 我们上次提到,要如何选择最优的W呢? 这就是要选择几种损失函数了. 我们要找到一种可行的方法来选择最优的W 先看简单的3个样本的例子 正式定义损失函数 ...

  8. Introduction & Directory

    一个日常划水的高中生而已啦,我不会承认这个博客的CSS是copy的 一个貌似并不准确的图-- <算法竞赛进阶指南>学习: 动态规划: DP经典例题--LIS&LCS 洛谷题解: 搜 ...

  9. 希腊字母表及latex代码

    希腊字母表及latex代码 字母大写 字母小写 英文名称 latex大写代码 latex小写代码 \(\Alpha\) \(\alpha\) alpha \Alpha \alpha \(\Beta\) ...

  10. [深度学习] CCPD车牌数据集介绍

    CCPD是一个大型的.多样化的.经过仔细标注的中国城市车牌开源数据集.CCPD数据集主要分为CCPD2019数据集和CCPD2020(CCPD-Green)数据集.CCPD2019数据集车牌类型仅有普 ...