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在事务上可以保持简洁和快速。
转载于:https://www.cnblogs.com/HigginCui/p/8666167.html
07_Redis事务相关推荐
- Redis 笔记(08)— 事务(一次执行多条命令、命令 watch/multi/exec/discard、错误处理)
1. 事务概念 Redis 中的事务 (transaction)是一组命令的集合.事务同命令一样是 Redis 的最小执行单位,一个事务中的命令要么都执行,要么都不执行.事务的原理是先将属于一个事务的 ...
- etcd 笔记(06)— Client 结构定义、客户端(初始化、KV存储Get、Put、事务 Txn、压缩 Compact、Watch、Lease
1. Client 定义 Client 定义如下: type Client struct {ClusterKVLeaseWatcherAuthMaintenance// 认证的用户名Username ...
- Redis 高级特性(1)—— 事务 过期时间 排序
1. Redis 高级特性 -- 事务 事务概念 Redis 中的事务 (transaction)是一组命令的集合.事务同命令一样是 Redis 的最小执行单位,一个事务中的命令要么都执行,要么都不执 ...
- 【spring】编程式事务控制
结构: AccountServiceImpl package com.itheima.service.impl;import com.itheima.dao.IAccountDao; import c ...
- 【Spring】spring基于纯注解的声明式事务控制
结构 去掉bean.xml config JdbcConfig package com.itheima.config;import org.springframework.beans.factory. ...
- 【Spring】spring基于注解的声明式事务控制
结构 domin package com.itheima.domain;import java.io.Serializable;public class Account implements Seri ...
- 【spring】spring基于xml的声明式事务控制
结构 domain package com.itheima.domain;import java.io.Serializable;public class Account implements Ser ...
- 【Spring】事务控制API
Spring事务控制需要明确 1. JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计==业务层==的事务处理解决方案. 2. Spring框架提供了一组事务控制的接口.在S ...
- 【Spring】基于xml实现事务控制(银行转账)
代码结构 domain类 package com.itheima.domain;import java.io.Serializable;/*** 账户的实体类*/ public class Accou ...
最新文章
- 对话百度贾磊/喻友平:深度学习正往跨领域融合高速发展
- django安装--mac系统
- win linux 装系统 通过 u盘
- 28335的CPU定时器解析
- 浏览器实验中的故障排除
- C/C++:Windows编程—代码实现IE保护模式的关闭和开启
- 没有Dubbo Admin,怎么查看zookeeper中注册的dubbo服务?
- 利用SQL建立数据库
- cron表达式解析 3秒执行一次
- STM8L中断线和中断端口使用方法
- 基于QT框架的离线词典应用程序
- JAVA下载的详细教程
- PgAdmin出现Utility file not found. Please correct the Binary Path in the Preferences dialog的解决办法
- c语言中结构体中默认值,C Struct中的缺省值
- 访问图片出现403的解决办法
- AD软件自动安装部署
- 一键绕过App签名验证
- 腾讯云企业邮箱设置别名
- Netty | 开启 Linux 平台下的 Native
- 教你如何完全解析Kotlin中的类型系统