mysql-通过例子解释四种隔离级别
SQL标准定义了4种隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。
低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
首先,我们使用 test 数据库,新建 tx 表,并且如图所示打开两个窗口来操作同一个数据库:
第1级别:Read Uncommitted(读取未提交内容)
(1)所有事务都可以看到其他未提交事务的执行结果
(2)本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少
(3)该级别引发的问题是——脏读(Dirty Read):读取到了未提交的数据
- #首先,修改隔离级别
set tx_isolation='READ-UNCOMMITTED';- select @@tx_isolation;
- +------------------+
- | @@tx_isolation |
- +------------------+
- | READ-UNCOMMITTED |
- +------------------+
- #事务A:启动一个事务
- start transaction;
- select * from tx;
- +------+------+
- | id | num |
- +------+------+
- | 1 | 1 |
- | 2 | 2 |
- | 3 | 3 |
- +------+------+
- #事务B:也启动一个事务(那么两个事务交叉了)
在事务B中执行更新语句,且不提交- start transaction;
- update tx set num=10 where id=1;
- select * from tx;
- +------+------+
- | id | num |
- +------+------+
- | 1 | 10 |
- | 2 | 2 |
- | 3 | 3 |
- +------+------+
- #事务A:那么这时候事务A能看到这个更新了的数据吗?
- select * from tx;
- +------+------+
- | id | num |
- +------+------+
- | 1 | 10 | --->可以看到!说明我们读到了事务B还没有提交的数据
- | 2 | 2 |
- | 3 | 3 |
- +------+------+
- #事务B:事务B回滚,仍然未提交
- rollback;
- select * from tx;
- +------+------+
- | id | num |
- +------+------+
- | 1 | 1 |
- | 2 | 2 |
- | 3 | 3 |
- +------+------+
- #事务A:在事务A里面看到的也是B没有提交的数据
- select * from tx;
- +------+------+
- | id | num |
- +------+------+
- | 1 | 1 | --->脏读意味着我在这个事务中(A中),事务B虽然没有提交,但它任何一条数据变化,我都可以看到!
- | 2 | 2 |
- | 3 | 3 |
- +------+------+
第2级别:Read Committed(读取提交内容)
(1)这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)
(2)它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变
(3)这种隔离级别出现的问题是——不可重复读(Nonrepeatable Read):不可重复读意味着我们在同一个事务中执行完全相同的select语句时可能看到不一样的结果。
|——>导致这种情况的原因可能有:(1)有一个交叉的事务有新的commit,导致了数据的改变;(2)一个数据库被多个实例操作时,同一事务的其他实例在该实例处理其间可能会有新的commit
- #首先修改隔离级别
set tx_isolation='read-committed';- select @@tx_isolation;
- +----------------+
- | @@tx_isolation |
- +----------------+
- | READ-COMMITTED |
- +----------------+
- #事务A:启动一个事务
- start transaction;
- select * from tx;
- +------+------+
- | id | num |
- +------+------+
- | 1 | 1 |
- | 2 | 2 |
- | 3 | 3 |
- +------+------+
- #事务B:也启动一个事务(那么两个事务交叉了)
在这事务中更新数据,且未提交- start transaction;
- update tx set num=10 where id=1;
- select * from tx;
- +------+------+
- | id | num |
- +------+------+
- | 1 | 10 |
- | 2 | 2 |
- | 3 | 3 |
- +------+------+
- #事务A:这个时候我们在事务A中能看到数据的变化吗?
- select * from tx; --------------->
- +------+------+ |
- | id | num | |
- +------+------+ |
- | 1 | 1 |--->并不能看到! |
- | 2 | 2 | |
- | 3 | 3 | |
- +------+------+ |——>相同的select语句,结果却不一样
- |
- #事务B:如果提交了事务B呢? |
- commit; |
- |
- #事务A: |
- select * from tx; --------------->
- +------+------+
- | id | num |
- +------+------+
- | 1 | 10 |--->因为事务B已经提交了,所以在A中我们看到了数据变化
- | 2 | 2 |
- | 3 | 3 |
- +------+------+
第3级别:Repeatable Read(可重读)
(1)这是MySQL的默认事务隔离级别
(2)它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行
(3)此级别可能出现的问题——幻读(Phantom Read):当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行
(4)InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题
- #首先,更改隔离级别
set tx_isolation='repeatable-read';- select @@tx_isolation;
- +-----------------+
- | @@tx_isolation |
- +-----------------+
- | REPEATABLE-READ |
- +-----------------+
- #事务A:启动一个事务
- start transaction;
- select * from tx;
- +------+------+
- | id | num |
- +------+------+
- | 1 | 1 |
- | 2 | 2 |
- | 3 | 3 |
- +------+------+
- #事务B:开启一个新事务(那么这两个事务交叉了)
在事务B中更新数据,并提交- start transaction;
- update tx set num=10 where id=1;
- select * from tx;
- +------+------+
- | id | num |
- +------+------+
- | 1 | 10 |
- | 2 | 2 |
- | 3 | 3 |
- +------+------+
- commit;
- #事务A:这时候即使事务B已经提交了,但A能不能看到数据变化?
- select * from tx;
- +------+------+
- | id | num |
- +------+------+
- | 1 | 1 | --->还是看不到的!(这个级别2不一样,也说明级别3解决了不可重复读问题)
- | 2 | 2 |
- | 3 | 3 |
- +------+------+
- #事务A:只有当事务A也提交了,它才能够看到数据变化
- commit;
- select * from tx;
- +------+------+
- | id | num |
- +------+------+
- | 1 | 10 |
- | 2 | 2 |
- | 3 | 3 |
- +------+------+
第4级别:Serializable(可串行化)
(1)这是最高的隔离级别
(2)它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。
(3)在这个级别,可能导致大量的超时现象和锁竞争
- #首先修改隔离界别
set tx_isolation='serializable';- select @@tx_isolation;
- +----------------+
- | @@tx_isolation |
- +----------------+
- | SERIALIZABLE |
- +----------------+
- #事务A:开启一个新事务
- start transaction;
- #事务B:在A没有commit之前,这个交叉事务是不能更改数据的
- start transaction;
- insert tx values('4','4');
- ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
- update tx set num=10 where id=1;
- ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql-通过例子解释四种隔离级别的更多相关文章
- MySQL数据库中的四种隔离级别
事务的隔离性比想象的要复杂,在 SQL 标准中定义了四种级别的隔离级别.通常而言,较低级别的隔离通常可以执行更高的并发,系统的开销也更低 READ UNCOMMITTED 该级别为未提交读.在该级别中 ...
- mysql四大特性与四种隔离级别
四大特性 1:原子性.事务是一个不可分割的整体,事务开始的操作,要么全部执行,要么全部不执行. 2:隔离性.同一时间,只允许一个事务请求同一组数据.不同的事务彼此之间没有干扰. 3:一致性.事务开始前 ...
- MySQL系列之二四种隔离级别及加锁
事务 1.定义:所有操作必须成功完成,否则在每个操作中所作的所有更改都会备撤销. 2.事务的ACID 原子性atomicity 一致性consistency 隔离性isolation 持续 ...
- 数据库操作事物的四大特性以及MySQL数据库的四种隔离级别
1 .事物操作数据库的四大特性(ACID) 1.原子性 (Atomicity) 原子性:就是事物的所包含的所有操作,要么全部成功,要么全部失败回滚. 2.一致性 (Consistency) 一致性:简 ...
- 【转载】mysql 四种隔离级别分析
sql标准中,有四种隔离级别,各个离级别都有各自的规则,隔离级别越低,允许并发越大,消耗的资源越少,但是越不安全,下面就mysql数据库来分别介绍一下(每个存储引擎实施的隔离级别会有稍微的不同)mys ...
- MySQL 四种隔离级别
什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...
- SQL事务的四种隔离级别和MySQL多版本并发控制
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的那些改变时可见的,那些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. ReadUncommitted( ...
- MySql四种隔离级别
什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...
- 面试问烂的 MySQL 四种隔离级别,看完吊打面试官!
阅读本文大概需要 5.6 分钟. 来源:网络 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操 ...
随机推荐
- 模块打包机--webpack--基础使用
什么是webpack? 作用有哪些? WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,Type ...
- tp volist需要便利两个数组时的处理办法
你需要便利两个数组,并且需要使用key 和value的试的时候,volist是否先得有些捉鸡? 我们可以便利其中一个数组,而另一个利用数组的指针来操作 next($arr) 将数组指针下移 key($ ...
- 【codeforces 749D】Leaving Auction
[题目链接]:http://codeforces.com/problemset/problem/749/D [题意] 有n个人在竞价; 按照时间的顺序给出n次竞价(可能有一些人没有参加竞价); 每次竞 ...
- 笔试中java的输入输出
一,输入 import java.util.*; import java.io.*; public class Main { public static void main(String[] args ...
- echarts 柱状图和饼状图动态获取后台数据
运用echarts来实现图表 1.首先下载echarts包 http://echarts.baidu.com/echarts2/doc/example.html,在这里我下载的是 2.将echart ...
- log4j.propertie配置具体解释
1.log4j.rootCategory=INFO, stdout , R 此句为将等级为INFO的日志信息输出到stdout和R这两个目的地,stdout和R的定义在以下的代码,能够随意起名.等级可 ...
- servlet修改后无效,仍然还是修改之前的效果
注意servlet的路径是否正确,默认是java resources文件夹中的src.当在webcontent->web-inf->classses->data中时,注意添加路径.否 ...
- iOS学习必须了解的七大手势
文章只要你有一点点基础应该就可以看的懂,文章只为学习交流 #import "ViewController.h" @interface ViewController () @prop ...
- [jzoj 5926] [NOIP2018模拟10.25] naive 的图 解题报告(kruskal重构树+二维数点)
题目链接: https://jzoj.net/senior/#main/show/5926 题目: 题解: 显然最小的最大路径在最小生成树上(最小生成树=最小瓶颈生成树) 于是我们建出kruskal重 ...
- xBIM 实战01 在浏览器中加载IFC模型文件
系列目录 [已更新最新开发文章,点击查看详细] 一.创建Web项目 打开VS,新建Web项目,选择 .NET Framework 4.5 选择一个空的项目 新建完成后,项目结构如下: 二.添 ...