写在前面的话

  之前在某个网站上看到一个问题: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. 数据库-Mysql语句

    Mysql语句 不定时更新 1.数据库相关的语句 /* 数据库操作 */ ------------------ -- 启动MySQL net start mysql -- 接与断开服务器 mysql ...

  2. 简述UDF/UDAF/UDTF是什么,各自解决问题及应用场景

    UDF User-Defined-Function 自定义函数 .一进一出: 背景 系统内置函数无法解决实际的业务问题,需要开发者自己编写函数实现自身的业务实现诉求. 应用场景非常多,面临的业务不同导 ...

  3. Anomaly Detection-异常检测算法(Coursera-Ng-ML课程)

    现实生活中有许多需要提前预防一些异常问题出现的情况,例如在飞机起飞前,对飞机各部分进行评估,看发动机等各个零件是否性能正常,若有潜在的问题(可能出现异常情况),则需要及时检修或更换. 那么我们如何去评 ...

  4. 如何定时备份Mysql数据库

    1.创建备份数据库存储目录 cd data/db mkdir backup #创建存储目录 2.添加备份脚本 vim backupdb.sh #创建脚本文件 脚本内容如下: #!/bin/sh db_ ...

  5. html之样式

    HTML 样式 1. font字体 font-family 字体样式 比如:微软雅黑.Serif 字体.Sans-serif 字体.Monospace 字体.Cursive 字体.Fantasy 字体 ...

  6. ubuntu查看并杀死自己之前运行的进程解决办法RuntimeError: CUDA error: out of memory

    问题描述:在跑深度学习算法的时候,发现服务器上只有自己在使用GPU,但使用GPU总是会报RuntimeError: CUDA error: out of memory,这是因为自己之前运行的进程还存在 ...

  7. Netty为什么不直接用AtomicXXX,而要用AtomicXXXFieldUpdater去更新变量呢?

    更多技术分享可关注我 前言 如果仔细阅读过Netty的线程调度模型的源码,或者NIO线程对象及其线程池的创建源码,那么肯定会遇到类似“AtomicIntegerFieldUpdater”的身影,不禁想 ...

  8. [ASP.NET Core MVC] 如何实现运行时动态定义Controller类型?

    昨天有个朋友在微信上问我一个问题:他希望通过动态脚本的形式实现对ASP.NET Core MVC应用的扩展,比如在程序运行过程中上传一段C#脚本将其中定义的Controller类型注册到应用中,问我是 ...

  9. Eclipse打包jar

    对一个包打jar包 右键包名-Export-Jar File-选择所在包的class文件(注意),如果选择java文件会失败-然后Finish 检查jar包是否正确,使用如jd-gui这样的反编译工具 ...

  10. Python数据库MySQL之数据备份、pymysql模块

    一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 掌握: #1. 测试+链接 ...