07_Redis事务
【简述】
事务是指一系列的操作步骤,着一些列的操作步骤,要么完全地执行,要不完全地不执行。
比如微博中:
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事务的更多相关文章
- Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
- SQLServer事务同步下如何收缩日志
事务同步是SQLServer做读写分离的一种常用的方式. 随着业务数据的不断增长,数据库积攒了大量的日志,为了腾出硬盘空间,需要对数据库日志进行清理 订阅数据库的日志清理 因为订阅数据库所有的数据都来 ...
- 事务日志已满,原因为“ACTIVE_TRANSACTION”
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 异常处理汇总-数据库系列 http://www.cnblogs.com/dunitia ...
- Mysql事务探索及其在Django中的实践(二)
继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...
- Mysql事务探索及其在Django中的实践(一)
前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...
- CRL快速开发框架系列教程七(使用事务)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 玩转spring boot——结合JPA事务
接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- PHP中PDO事务的使用方法
事务 (Transaction) 是操作数据库中很重要的一个功能, 它可以让你预定一条, 或者一系列 SQL 语句, 然后一起执行. 在执行的过程中, 如果其中的某条执行失败, 可以回滚所有已更改的操 ...
随机推荐
- APP元素的四大类
一个完整的APP包括四大类:各种“栏”.内容视图.控制元素.临时视图 各种“栏”:状态栏.导航栏.标签栏.工具栏.范围栏 内容视图:列表视图.卡片式图.集合视图.图片视图.文本视图 控制元素:用于控制 ...
- python全栈开发学习_day1_计算机五大组成部分及操作系统
一.计算机五大组成部分: 1)五大组成: 1.控制器(指挥系统,用于控制其他计算机硬件的工作) 2.运算器(用于数学运算及逻辑运算) 3.存储器(寄存器,高速缓存,内存,磁盘(机械,固态),磁带) 4 ...
- mybatis的CRUD实例(三)
前面的文章我们已经实现了根据id查询用户信息的功能,下面我们进行其他业务功能的实现. 一.根据用户名模糊查询用户列表 查询使用的sql : select * from user where usern ...
- 安装Windows 64 位 mysql 最新版本解压包中没有data目录和my-default.ini及服务无法启动的快速解决办法
mysql官网下载地址:https://dev.mysql.com/downloads/mysql/ 首先安装包解压后,没有网上教程里面提到的data文件夹和my-default.ini 配置环境变量 ...
- 采用轮询的方式检测串口输入&&采用中断的方式检测串口输入的区别!
区别1:中断USART1_IRQHandler()不放进main(主函数)里,而轮询检测rcv()需要: 但是需要在主函数里对中断NVIC()进行初始化,因为所有程序都是从主函数开始一步一步执行,想要 ...
- linux 安装谷歌浏览器
1. 下载 rpm 包https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm2. 安装依赖包yum ins ...
- Mac上实现对Python的版本切换
最近朋友邀请我帮忙写个比特币自动化交易程序,要求的平台是Okex,用Python写,之前到是自己学过一点自动化交易,不过是MT5的.看了一下Okex提供的API接口,和MT5不一样,它并没有现成的ID ...
- php codeception
前言 本测试用例只针对yii2 basic框架而写,若要支持其他框架,请自行查看phpcodeception指导(需要FQ)http://codeception.com/ yii2 basic默认已经 ...
- Kubeadm and Kops
Kubeadm是Kubernetes官方推出的快速部署Kubernetes的集群工具,其思路是将Kubernetes相关服务容器化以简化部署. With the release of kubeadm ...
- 如何在react&webpack中引入图片?
在react&webpack项目中需要引入图片,但是webpack使用的模块化的思想,如果不进行任何配置,而直接在jsx或者是css中使用相对路径来使用就会出现问题,在webpack中提供了u ...