写在前面的话

  之前在某个网站上看到一个问题:redis在什么情况下出现事务不会滚的情况,以此为由并结合redis官方文档整理这边笔记。不足之处,请指出,谢谢。

事务

redis支持事务,提供两条重要的保证:
  • 在同一个事务的命令都是序列化的和有序执行的。这保证这些命令执行像单个隔离操作。
  • 要么所有的命令都执行,要么都不执行。所以事务也是原子性的。exec命令执行事务中的所有命令,如果在调用exce命令前,客户端和服务端断开连接,那么没有一个命令执行,如果exce命令调用,所有的命令执行。当使用aof时,redis确保使用一个系统调用write(2)将事务写到磁盘。然而如果redis服务崩溃或者系统管理员强制杀死,就会有可能只有一部分操作被注册。redis在重启时会发现这种情况,并且错误退出。使用redis-check-aof工具修复aof文件,移除部分事务,因为服务可以重启。
 

事务内部错误

在事务期间可能会出现两种命令错误:
  • 命令可能失败排队,因此在exec调用之前,就会出现错误。如命令的语法错误(参数个数错误,命令名错误),或者其他灾难环境如oom。
  • 命令失败可能在exec调用之后,例如操作一个key使用错误的值(如调用list操作却调用string的命令)。
客户端知道第一种错误,在执行exec之前,通过检测返回值:如果是queued 表明正确的排队,否则返回失败信息。如果在期间出现异常,大多数客户端取消执行事务。
 

为什么redis不支持回滚

如果你了解数据库,就应该知道事务回滚,事实上redis命令在事务期间失败,仍然执行剩余的操作,而不是回滚,对于你来说,可能太古怪。
  • redis命令只有调用错误语法才可能失败(在命令队列队列中可能发现不了),或者操作key使用错误的数据类型:这意味着实际这种命令会导致程序错误,并且这种错误应该在开发环境发现,而不是生产。
  • redis内部实现简单和快速的,因为它不需要支持事务回滚。
 

事务操作命令

multi //开启事务
exec // 执行事务
discard //取消事务块执行
watch
unwatch

事务执行事务回滚失败

127.0.0.1:> multi
OK
127.0.0.1:> set key1 value1
QUEUED //语法校验通过。
127.0.0.1:> set key2 value2
QUEUED
127.0.0.1:> incr key1
QUEUED
127.0.0.1:> exec
) OK
) OK
) (error) ERR value is not an integer or out of range
127.0.0.1:> get key1
"value1"
127.0.0.1:> get key2
"value2"
事务执行完成,但是没有因为错误而失败,这种失败是Key对应的数据类型错误,属于开发阶段的错误,redis检测不出来这种错误,只有实际执行才能校测出问题。

127.0.0.1:> multi
OK
127.0.0.1:> set key1 value1
QUEUED
127.0.0.1:> set key2 value2
QUEUED
127.0.0.1:> incre key1
(error) ERR unknown command `incre`, with args beginning with: `key1`,
127.0.0.1:> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:> get key1
(nil)
这种错误属于语法错误,没有incre命令,redis能检测出这种错误,所以事务执行失败。

取消事务

127.0.0.1:> multi
OK
127.0.0.1:> set key1 value1
QUEUED
127.0.0.1:> discard
OK
127.0.0.1:> get key1
(nil)
127.0.0.1:>

redis 浅谈事务的更多相关文章

  1. mysql浅谈--事务ACID特性

    mysql MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管 ...

  2. 浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决

    浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决 ​ 在前几个月时,我们项目出现了分布式事务的问题,那么什么是分布式事务问题呢,简单的说,我们有俩服务A和B,它们对应 ...

  3. 浅谈Oracle事务【转载竹沥半夏】

    浅谈Oracle事务[转载竹沥半夏] 所谓事务,他是一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单元.通俗解释就是事务是把很多事情当成一件事情来完成,也就是大家都在一条船上,要 ...

  4. 【SqlServer系列】浅谈SQL Server事务与锁(上篇)

    一  概述 在数据库方面,对于非DBA的程序员来说,事务与锁是一大难点,针对该难点,本篇文章视图采用图文的方式来与大家一起探讨. “浅谈SQL Server 事务与锁”这个专题共分两篇,上篇主讲事务及 ...

  5. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  6. 浅谈.net中数据库操作事务

    .net中的事务 关键几点 概念:1:什么是事务 2:什么时候用事务 3:基本的语法 (1): 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常 ...

  7. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

  8. 重新学习MySQL数据库6:浅谈MySQL的中事务与锁

    『浅入深出』MySQL 中事务的实现 在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的:在这篇 ...

  9. 浅谈SQL Server事务与锁(上篇)

    一  概述 在数据库方面,对于非DBA的程序员来说,事务与锁是一大难点,针对该难点,本篇文章试图采用图文的方式来与大家一起探讨. “浅谈SQL Server 事务与锁”这个专题共分两篇,上篇主讲事务及 ...

随机推荐

  1. [BJDCTF 2nd]fake google

    [BJDCTF 2nd]fake google 进入页面: 试了几下发现输入xxx,一般会按的格式显示, P3's girlfirend is : xxxxx 然后猜测会不会执行代码,发现可以执行 & ...

  2. hGame2020第二周第一题题解

    Description: Cosmos通过两个小时速成了PHP+HTML,他信心满满的写了一个博客,他说要从博客后台开始......(flag在根目录, 禁止使用任何扫描器) Challenge Ad ...

  3. 【docker Elasticsearch】Rest风格的分布式开源搜索和分析引擎Elasticsearch初体验

    概述: Elasticsearch 是一个分布式.可扩展.实时的搜索与数据分析引擎. 它能从项目一开始就赋予你的数据以搜索.分析和探索的能力,这是通常没有预料到的. 它存在还因为原始数据如果只是躺在磁 ...

  4. 微信开发+百度AI学习:微信网页开发环境搭建

    参考微信官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 两步即可获取微信网页开发能力 STEP1: ...

  5. Leetcode_面试题62. 圆圈中最后剩下的数字(约瑟夫环)

    经典的约瑟夫环,n个人排成一圈,第m个出队. 递归 code1 class Solution { public: int f(int n,int m){ if(n==1){ //递归边界,最后一个 r ...

  6. 使用toString()检测对象类型

    可以通过toString() 来获取每个对象的类型.为了每个对象都能通过 Object.prototype.toString() 来检测,需要以 Function.prototype.call() 或 ...

  7. (连续的矩形)HDU - 1506

    题意:7 2 1 4 5 1 3 3  直接讲数据 :给出7个矩形的高,底长都为1,求最大的连通的矩形块的面积 思路:如果暴力的话肯定超时,有一个特别巧妙的预处理,如果我们知道每一个矩形的左右两边能延 ...

  8. (note)从小白到产品经理之路

    学习了云课堂的产品课程,整理出部分笔记,以作备用参考,方便实际运用过程中查看巩固. 1.产品工具:Axure.mindmanager.viso.办公软件wps 2.产品人需要具备的品格 富有同理心,习 ...

  9. IntelliJ Idea 中文乱码问题

    首先,Idea真的是一款很方便的开发工具,但是关于中文乱码这个问题我不得不吐槽,这个编码也弄得这么麻烦干嘛呀...下面就说一下怎么解决中文乱码问题: 1.首先是编辑器的乱码,这个很好解决,file-& ...

  10. Bug2020011601,在ssh项目的applicaitonContext.xml中,少了一个双引号,打包成功(没报错),项目运行才发现

    在ssh项目的applicaitonContext.xml中,少了一个双引号,打包成功(没报错),项目运行才发现. 加上少的双引号,解决了.