Redis数据库系列(四)、Redis事务、乐观锁和分布式锁
第四章、Redis事务、乐观锁和分布式锁
什么是事务机制?
4.1、关系型数据库中的事务机制遵循ACID规则
关系型数据库例如MySql、Oracle;
事务的英文是transaction,以现实中的银行交易做示例,关系型数据库事务机制有四大特性:
A(Atomicty)原子性:
原子性,也就是说在事务里的所有操作,要么都做,要么都不做,事务成功的条件是事务中的所有操作都成功执行,只要有一个操作失败,整个事务失败,将会发生回滚。
eg:银行转账,张三向李四转100元,分为两个步骤
(1)、从张三账户取出100元
(2)、向李四账户存入100元
事务机制就是要保证,这两个步骤要么同时执行成功,要么同时执行失败;如果说没有事务机制,从张三账户取出100元的同时银行突然断电了,那么李四账户中却没有转入100元,这时候张三账户却少了100元,张三恼死也没底说理,你说这气不气?C(Consistency)一致性
一致性也就是我们常说的数据的完整性约束,事务的运行不会改变数据的完整性约束。
怎么说:例如a+b=10,如果一个事务改变了a,那么b随之也要改变,才能保证a+b的结果不会改变仍然为10,这就叫数据的完整性约束(即一致性),否则事务失败。I(Isolation)独立性(隔离性)
事务的独立性,也就是我们常说的隔离性,所谓隔离性就是说并发事务彼此之间不会受到干扰,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交事务,第一个事务正在访问的数据就不会受到干扰。
D(Durability)持久性
持久性也就是说事务一旦提交,事务中所作的数据操作将会永久保存在数据库中,即使出现宕机现象数据也不会丢失。
4.2、非关系型数据库的事务机制(NoSql)
非关系型数据库例如Hbase、MongodDB、Redis;
这里我们讲解Redis数据库的事务机制
redis事务机制定义:
- redis的事务机制中,可以一次执行多条命令,本质上是将一组命令放入集合队列中,而且这些命令将会被序列化,即按顺序执行并且不会被其他命令插入干扰和中断。
- 在redis中,事务的作用就是在一个队列中,一次性、顺序性、排他性的执行一系列命令。
事务的执行顺序和周期:
- 创建事务:使用multi开启一个事务。
- 加入队列:在开启事务后,每次操作的命令将会插入到队列中,并被序列化,同时这些命令在事务未提交前不会被执行。
- 提交事务:使用exec提交事务。
有关事务常用的命令
- multi 开启事务,记录一个事务块的开始,执行后通常会返回OK,这个时候用户可以输入多条操作指令,redis将会把这些指令逐条放入集合队列中,然后序列化这些指令。
- discard 回滚事务,要在提交事务之前使用,事务中所有的指令操作将会失效。
- exec 提交事务,按顺序执行事务中的所有操作命令。
- watch(类似于乐观锁) 监视一个或多个数据, 注意监视数据要在multi开启事务之前,如果在事务未提交之前,正监视的数据被其他用户所修改了,那么回头再提交这个事务,事务中的命令都会失效。
- unwatch(释放锁)
- setnx(分布式锁)是(set if not exists)的缩写,也就是说只有key不存在的时候才会设置
setnx key value
当且仅当key不存在时,将key的值设置为value;
若设定的key已经存在,则setnx不做任何操作。- epxire (用于设置key的过期时间)
#后面的second代表多少秒后释放该锁变量 expire key second
- pexpire(用于设置key的过期时间)
#后面的miliseconds代表多少毫秒后释放该锁变量 pexpire key miliseconds
4.3、实际操作演示
- 开启事务和提交事务
- 如果事务过程中所包含的命令语法出现错误,在exec提交事务时,整个事务将会自动回滚;
- 而如果是命令逻辑赋值错误,在exec提交事务时,在这行赋值命令前面的正确命令都会事务提交成功,只有赋值错误这行代码会自动事务回滚。
- 事务回滚,一定要在提交事务之前进行回滚
- 监视(乐观锁)
watch - 客户端1:
- 客户端2(在客户端1未提交事务之前另一个客户执行修改操作):
- 客户端1(此时客户端1提交事务,发现上述事务机制过程全部无效):
- 分布式锁
- 客户端1:
- 客户端2(在客户端1设置的释放时间未到时,执行修改同一个变量的操作):
Redis数据库系列(四)、Redis事务、乐观锁和分布式锁相关推荐
- Redis数据库(四)——Redis集群模式(主从复制、哨兵、Cluster)
Redis数据库(四)--Redis集群模式(主从复制.哨兵.Cluster) 一.Redis主从复制 1.主从复制流程 二.哨兵模式 1.哨兵模式集群架构 2.哨兵模式主要功能 3.哨兵监控整个系统 ...
- redis thinkphp mysql_Thinkphp5怎么扩展Redis数据库,实现Redis的CURD操作
Thinkphp5怎么扩展Redis数据库,实现Redis的CURD操作 Redis怎么使用Redis数据库,本篇文章主要介绍在Thinkphp5项目中如何使用Redis数据库 一.基础环境 PHP扩 ...
- redis锁和分布式锁的实现
redis环境搭建 redis在java.spring.springboot中的实现 redis锁 1.添加依赖 <dependency><groupId>org.spring ...
- 乐观锁、悲观锁、分布式锁的总结
乐观锁.悲观锁.分布式锁 面试必备-行锁.表锁 - 乐观锁.悲观锁的区别和联系(史上最全)_yxg520s的博客-CSDN博客_行锁和表锁是悲观锁吗 乐观锁.悲观锁.读写锁.互斥锁之间的关系_Leri ...
- 详解线程锁、进程锁、分布式锁以及数据库锁
线程锁.进程锁.分布式锁以及数据库锁 1. 锁的介绍以及应用: 2. 定时器实现任务生产: 3. 手撕多线程任务队列: 视频讲解如下,点击观看: 线程锁.进程锁.分布式锁以及数据库锁丨C/C++丨Li ...
- java mysql 分布式锁_Java分布式锁之数据库方式实现
之前的文章<Java分布式锁实现>中列举了分布式锁的3种实现方式,分别是基于数据库实现,基于缓存实现和基于zookeeper实现.三种实现方式各有可取之处,本篇文章就详细讲解一下Java分 ...
- 详解线程锁、进程锁以及分布式锁,开发过程中解决的具体问题
聊聊线程锁.进程锁以及分布式锁 1. 线程锁-如何调度消费任务队列的线程池: 2. 进程锁-如何解决nginx惊群问题 3. 分布式锁-如何解决分布式系统中锁竞争问题 [Linux后端开发系列]详解线 ...
- 线程锁,进程锁以及分布式锁丨锁的实现及原理分析丨高效的使用
线程锁.进程锁以及分布式锁 1. 线程锁 2. 进程锁 3. 分布式锁 [技术分享篇]线程锁,进程锁以及分布式锁丨锁的实现及原理分析丨高效的使用 更多精彩内容包括:C/C++,Linux,Nginx, ...
- 数据库系列7:事务与锁的实现原理
1.数据库事务的特征 1.1事务的四大特征ACID 原子性Atomicity:对数据库的一系列操作,要么全成功,要么全失败.如果前面的操作成功了,后面的失败了,就必须回滚. 隔离性 Isolation ...
最新文章
- 利用graphviz模块展示斐波那契数列的递归函数调用图(Python)
- 3月16日 winform
- int型数据占用的内存空间及ASCII码表
- Ubuntu: ldconfig(解决*.so不是符号连接)
- 推荐几款爬虫软件与无需编程的数据分析工具
- 中国最好学科排名发布:北大14个学科全国第一,北京高校上榜数居首
- windows进入mysql
- malloc动态内存分配
- 再次提升“华容道自动求解”程序效率
- 前端三大框架 Vue.js、AngularJS、React 的区别
- WSL1升级到WSL2
- 关于STM32Flash详解
- 数据分析三大神器之三:matplotlib
- keep-alive和activated
- 蓝牙BLE协议分析【附代码实例】
- 2019 中科院 JCR 推荐 期刊 列表 计算机部分
- 大连四六级培训百家外语国际部四六级考前冲刺关键在于词汇
- P1345 [USACO5.4]奶牛的电信Telecowmunication
- Unity3D学习:射击小游戏——飞碟世界
- 2021年起重机械机械安装维修报名考试及起重机械机械安装维修最新解析
热门文章
- 我的世界服务器无限圈地指令,我的世界圈地指令大全 领地权限指令合集
- oracle ogg dataguard,Oracle DataGuard与GoldenGate比较
- 设计模式(二)(装饰者模式、工厂方法模式、抽象工厂模式)
- Java 多态的基本操作
- Winform设计-小百货 涵盖基础插件学习(适合新手)
- ps4播放html5视频网站,PS4视频媒体播放器更新支持更多视频格式
- 如何将excel表格导入word_怎么把excel表格导入word
- C++语法(二)string和int、long int、float的转换
- 社交场景下的功能自动化测试解决方案
- 领域驱动设计在讲什么