【简述】

事务是指一系列的操作步骤,着一些列的操作步骤,要么完全地执行,要不完全地不执行。

比如微博中:

A用户关注了B用户,那么A的关注列表里就会有B用户,B用户的粉丝列表里就会有A用户。

这个关注的步骤就是由一些列的操作步骤构成:

(1).A用户添加到B的粉丝列表

(2).B用户添加到A的关注列表

这两个步骤必须全部执行成功,整个逻辑才是正确的,否则就会产生数据的错误,比如A用户的关注列表有B用户,但B的粉丝列表里没有A用户,所以要保证一系列的操作都完全成功,提出了事务控制的概念。

【Redis事务】

Redis中的事务(transaction)是一组命令的集合,至少是两个或两个以上的命令。

事务同命令一样都是Redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行。

【事务简单例子】

先以 MULTI 开启一个事务,然后将多个命令入队到事务中,最后由 EXEC 命令触发事务,一并执行事务队列中的所有命令。

【注意——版本差异】

2.6.5版本之前:

单个Redis命令的执行原子性的,但Redis没有在事务上增加任何维持原子性的机制,所以Redis事务的执行并不是原子性的。

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的的回滚,也不会造成后续指令不做。

2.6.5之后的版本:

能保证一个事务中的所有命令要么都执行,要么都不执行。

如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不执行。

而一旦客户端发送了EXEC命令,所有的命令都会被执行,即使伺候客户端断线也没关系,因为Redis中已经记录了所有要执行的命令。

【异常情况1——语法错误(3.0版本,事务不执行例子)】

上面例子中,第一个指令 set name "zhangsan" 成功加入了事务队列,但是接下来的命令有语法错误,而2.6.5之后的版本只要有一个命令有语法错误,执行EXEC命令后Redis会直接返回错误,连语法正确的命令也不会执行。

【异常情况2——运行时错误(语法正确,运行错误)】

运行时错误是指在命令执行时出现的错误。比如下例中的键值不同类型操作,这种操作实际上是在执行之前Redis无法发现的,所以事务里这样的命令会被Redis接收并执行的,如果事务里的一条命令出现了运行时错误,事务里的其他命令依旧会继续执行。

【复杂情况——利用Watch实现乐观锁】

[悲观锁]

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

[乐观锁]

乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改该数据,所以不会上锁,但是再更新的时候会判断一下在此期间别人有没有去更新这条数据,一般使用版本号机制进行判断,乐观锁适用于多读的应用类型,这样可以提高吞吐量。

乐观锁大多数情况是基于数据版本号(version)的机制实现的,何谓数据版本呢,即为数据添加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表添加一个“version”字段。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加1,此时将提交的数据version与数据库表对应的version进行对比,如果提交的version大于数据库当前的version,则予以更新,否则认为是过期数据,不予以更新。

[Redis实现的乐观锁]

【注意】

Redis的事务没有关系型数据事务提供的回滚(rollback)功能,为此开发者必须在事务执行出错后自己收拾烂摊子,将数据库复原回事务执行前的状态。

不过由于Redis不支持回滚功能,使得Redis在事务上可以保持简洁和快速。

07_Redis事务的更多相关文章

  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 语句, 然后一起执行. 在执行的过程中, 如果其中的某条执行失败, 可以回滚所有已更改的操 ...

随机推荐

  1. 01. css sprite是什么,有什么优缺点?

    1.css sprite是什么,有什么优缺点? 通常被意译为“CSS图像拼合”或“CSS贴图定位” 1)CSS Sprites的优点 利用CSS Sprites能很好地减少网页的http请求,从而大大 ...

  2. python脚本中appium的自启动自关闭

    前提:已安装appium命令行版本 将appium的启动及其关闭直接写在脚本中,运行起来会方便很多 创建startAppiumServer.bat 和 stopAppiumServer.bat文件,然 ...

  3. Devexpress中统一设置字体样式的方法

    #region 设置默认字体.日期格式.汉化dev DevExpress.Utils.AppearanceObject.DefaultFont = new System.Drawing.Font(&q ...

  4. Python——数据交换格式简要

    简单数据交换格式 CSV: 一般用  open()  函数和字符串拆分  split()  方法,但python有内置的csv模块 读: import csv with open(r"C:\ ...

  5. 916. Word Subsets

    We are given two arrays A and B of words.  Each word is a string of lowercase letters. Now, say that ...

  6. springboot+redis实现缓存数据

    在当前互联网环境下,缓存随处可见,利用缓存可以很好的提升系统性能,特别是对于查询操作,可以有效的减少数据库压力,Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存 ...

  7. Git学习系列之Git产生的背景

    不多说,直接上干货! 史上最浅显易懂的Git教程! 为什么要编写这个教程?因为我在学习Git的过程中,买过书,也在网上Google了一堆Git相关的文章和教程,但令人失望的是,这些教程不是难得令人发指 ...

  8. SqlServer function 函数

    SqlServer的数据库Tsql还是很强大,以此来纪念下表值函数的语法吧. -- ============================================= -- Author: & ...

  9. Docker 教程

    转自:http://www.runoob.com/docker/docker-tutorial.html Docker 教程

  10. Centos 从零开始 (三)

    8:连接阿里云. 需要用到 ssh指令进行远程登陆 [root@localhost ~]# service sshd start #如果没开启服务的话,需要开启服务. [root@localhost  ...