事务隔离机制原理分析以及是否可以防止订单超卖
事务的隔离机制是指:
Read Uncommitted(读取未提交内容)
Read Committed(读取提交内容)
Repeatable Read(可重读)
Serializable(可串行化)
具体的解释最经典的MySQL书《高性能MySQL(第3版)》已经有了就不在其他地方再引用了:
隔离机制的比较
其实也有人喜欢用锁来控制并发,书中还提到了“隐式”和“显示锁定”,是这么建议的:
虽然这样,但是其实如果不经过实际的演练还是很难理解上面说的事务隔离机制到底怎么样可以防止并发。
1.查看MySQL版本
我们的版本是5.1.7
2.查看存储引擎
>show engines;
存储引擎是:InnoDB
3.实验表
假设有个商品表g,关键字段num表示库存,name表示商品名称
主要就是看不同事务隔离机制下并发修改库存是否会出现超卖。
假设我们的程序需要先查询库存,如果库存>0都可以卖,update扣库存,否则rollback。
为了制造并发肯定需要2个事务,假设是A和B。
4.确认事务隔离机制
修改会话的事务隔离级别
set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;
>select @@global.tx_isolation,@@tx_isolation;
5.Serializable
场景一:
显然一开始AB查询的数据是一样的num=1
A开始update
这时候在等待,无法update。
过一会就超时了。
如果这个时候B也update那么一样会等待超时
所以这样,AB就会都超时。
这时即使commit也是返回0,数据库不会变化。
场景二:
A在update等待的时候,B马上commit,但是B没有update
查看结果
这次A成功的扣库存。
所以从上面可以得出一个结论:serializable是可以很好的控制并发。
然后需要把库存改为1,便于测试。
6.read committed
>set session transaction isolation level read committed;
>select @@global.tx_isolation,@@tx_isolation;
场景三:
初始化AB查出来的库存都是1,然后A可以update一条数据,无等待。
这时候AB再比较下库存,A已经是0,B是1,因为A没有commit。
然后A执行commit操作,这时候B再查已经是库存0;
这时候B执行update返回是0行,因为update不能满足where条件,所以B只有Commit,然后重新提交。
场景四:
一开始AB都是一样的库存1,然后A开始update,然后A的库存是0,B是1,因为A还没有提交。
这时候B再update
按照前面的经验,B等待其实是再等A提交,A如果一直不提交,B就会超时。
这时A提交commit,B查询就得到A更新后的结果,这时B查到库存是0自然不会去更新,也就只能结束事务。
场景五:
AB先后update,然后A在B超时之前commit,这时由于B已经读到A更新后的结果0,所以B就不能成功update。
7.repeatable read
>set session transaction isolation level repeatable read;
>select @@global.tx_isolation,@@tx_isolation;
场景六:
然后A开始update,然后A和B分别读到库存是1和0
然后A提交commit,这时候再查看A和B的库存还是保持不变。
这时候B再次尝试update
依然是返回0条,说明更新不成功。
场景八:
AB同时update
如果A不及时commit那么B肯定会超时
场景九:
就是场景八A及时commit
如果A及时commit
所以可以看出无论是read committed还是repeatable read只要update的条件where num>0足够充分都是可以控制并发防止超卖的。
如果没有带where num>0这个控制条件,那么肯定会可以update成功的。
8.read uncommitted
这个是需要杜绝的,就不讨论了。
9.如果没有带where num>0,那么会怎么样呢。其实只要理解了上述流程就可以想明白会怎么样。
对于read committed
A已经update,B读到库存是0自然不会去更新;
A没有update,B读到库存是1,这要看A会不会及时提交;
如果A及时提交,B自然会去更新因为满足where条件,且成功,这样就超卖-1;
这时候由于B没有提交,所以AB分别查出0和-1
然后B提交commit,AB查出的都是-1,就不演示了。
修改会话为repeatable read
AB先后update,B在等待
然后A立即提交commit,B马上update得到返回。
结果就是-1产生了超卖:
总结:
1.使用serializable是可以防止超卖,但是性能怎么样需要数据说明;
2.read committed和repeatable read带上where条件库存num>0都是可以防止超卖的,不过需要处理超时。
3.其他各种组合情况还会更复杂,具体具体问题具体分析。
事务隔离机制原理分析以及是否可以防止订单超卖相关推荐
- 事务隔离机制原理深入分析以及MySQL不同隔离级别分场景下实验对比
这是我总结的事务的四种隔离机制,比较好理解,主要是有些地方文字游戏说不清楚很容易混淆: Read Uncommitted(读未提交)A未完,B已更新,未提交,A读到B已更新的数据,由于未提交,那么可能 ...
- 面试刷题29:mysql事务隔离实现原理?
mysql的事务是innodb存储引擎独有的,myisam存储引擎不支持事务. 事务最经典的例子就是转账了,事务要保证的是一组数据库的操作要么全部成功,要么全部失败.是为了保证高并发场景下数据的正确性 ...
- Mysql事务隔离机制
SQL隔离机制: 所谓隔离机制,指的是读与写之间的隔离,指的是在多事务并行的时候,A事务的读与B事务的写之间的隔离,也就是说B事务的写对A事务的可见性. 多事务并发运行的时候,同时读写一个数据,可能会 ...
- Mysql 面试常问4 -- 锁模块之事务并发访问产生的问题以及事务隔离机制 InnoDB支持事务
锁模块之数据库事务的四大特性 数据库事务的四大特性和程序事务的四大特性基本相同 ⑴ 原子性(Atomicity) 原子性,这个是最简单的.说的是一个事务内所有操作共同组成一个原子包,要么全部成功,要么 ...
- binder机制原理分析(一):ServiceManager 进程启动
binder机制原理分析一共分5个部分,其实省了一点,但是分析到后面都差不多了,以后再补充吧. 1.ServiceManager 进程启动 2.普通Service注册到ServiceManager 3 ...
- Android锁屏机制原理分析
转载自:http://www.2cto.com/kf/201401/273898.html 春节前最后几天了,工作上几乎没有什么要做.大致整理下之前工作中写的文档,PPT,手册. 由于去年一年完全转到 ...
- Java面试题及答案2019版(下),mysql事务隔离级别原理
答:TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小.TreeMap要求存放的键值对映射的 ...
- mysql 中的脏读与幻读_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...
首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...
- mysql 可重复读 悲观锁_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...
首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...
最新文章
- Android Java使用JavaMail API发送和接收邮件的代码示例
- 杜克大学出来的NBA球星有哪些?
- 什么是标准输入,标准输出(stdin,stdout)
- [备忘]WPF的Colors类
- js高级—查询商品案例
- 时代银通笔试20181023
- Xshell链接不上云服务器的解决方案
- 利用 VBA 和 HTML自制兼容 WPS及 EXCEL(32位/64位)的颜色选择器
- 乔治亚理工学院计算机专业,乔治亚理工学院
- echarts官网demo
- windows10怎么卸载计算机,win10易升,详细教您如何彻底卸载删除win10易升
- 打包java项目_Java项目常见打包方式
- python用函数判断一个数是否为素数_【转载】Python脚本判断一个数是否为素数的几种方法...
- 深入 Parcel架构与流程
- 【多多情报通】看完让人焕然大悟的6种拼多多店铺玩法
- Windows10操作系统共享文件夹给VMWare虚拟机centos 7 操作系统使用
- 新手提问!求解答QAQADODB.Recordset 错误 #x27;800a0bb9#x27; 参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突。
- Android/IOS 实现接触NFC自动跳转到App,如果未安装App,则跳转到应用市场
- 微信支付2.0版本,更换参数即可使用
- C_.NET+Framdwork题库(未整理完,有时间再补)
热门文章
- HDU - 2767 Proving Equivalences tanjar强连通-DAG性质
- excel:隔行选取复制功能
- 【OpenCV】将单通道的Mat对象转换为三通道的Mat
- 基于地平面的单目视觉里程计绝对尺度估计
- 设置WebStorm查看本地源码文件个人修改的历史记录快捷键Alt+Shift+H、Ctrl+Shift+H(通常用于调试bug,发现文件出问题需要回溯到若干天之前)
- 【力扣网练习题】罗马数字转整数
- 在Ubuntu 16.04.5 LTS上安装pygame模块
- [综合面试] 计算机面试书籍与求职网站推荐
- Python入门基础教程 Working with Python – Introductory Level
- Unity 3D为策略游戏创建地图学习教程