未加星标

事务隔离机制原理分析以及是否可以防止订单超卖

字体大小 | |
[数据库(综合) 所属分类 数据库(综合) | 发布者 店小二04 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏

事务的隔离机制是指:

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,便于测试。

本文数据库(综合)相关术语:系统安全软件

主题: MySQLSQLInnoDB超卖数据其实数据库
分页:12
转载请注明
本文标题:事务隔离机制原理分析以及是否可以防止订单超卖
本站链接:http://www.codesec.net/view/484730.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 数据库(综合) | 评论(0) | 阅读(40)