MySQL事务隔离级别

摘要:
ReadCommitted这是大多数数据库系统(但不是MySQL)的默认隔离级别。InnoDB和Falcon存储引擎使用多版本并发控制(MVCC)来控制MySQL事务隔离级别对其性能的影响。默认情况下,MySQL的工作级别为3。我们知道,事务隔离是为了避免并发操作的相互影响,并导致数据不一致。查看MySQL数据库中当前事务的隔离级别:

 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

Read Uncommitted(读取未提交内容)
       在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
Read Committed(读取提交内容)
       这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
Repeatable Read(可重读)
       这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
Serializable(可串行化) 
       这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:

20151219142625513.jpg (838×267)
MySQL事务隔离级别对其性能的影响
MySQL默认工作在级别三下。我们知道事务隔离是为了避免并发操作相互影响而导数据的不一致性。所以为了保证数据的一致性,就引入了事务隔离的功能。以上四个级别的对数据的一致性保护是逐步提高的。级别4对事务的隔离效果最好,但是性能最差,一般不再生产环境中使用。

  在MySQL数据库中查看当前事务的隔离级别:

    select @@tx_isolation;
  在MySQL数据库中设置事务的隔离 级别:

    set  [glogal | session]  transaction isolation level 隔离级别名称;

    set tx_isolation=’隔离级别名称;’
使用MySQL数据库演示不同隔离级别下的并发问题
  同时打开两个窗口模拟2个用户并发访问数据库

/*创建账户表*/
create table account(
    id int primary key auto_increment,
    name varchar(40),
    money float
);

/*插入测试数据*/
insert into account(name,money) values('A',1000);
insert into account(name,money) values('B',1000);
insert into account(name,money) values('C',1000);

1、当把事务的隔离级别设置为read uncommitted时,会引发脏读、不可重复读和虚读
  A窗口
    set transaction isolation level  read uncommitted;--设置A用户的数据库隔离级别为Read uncommitted(读未提交)
    start transaction;--开启事务
    select * from account;--查询A账户中现有的钱,转到B窗口进行操作
    select * from account--发现a多了100元,这时候A读到了B未提交的数据(脏读)

  B窗口
    start transaction;--开启事务
    update account set money=money+100 where name='A';--不要提交,转到A窗口查询

2、当把事务的隔离级别设置为read committed时,会引发不可重复读和虚读,但避免了脏读
  A窗口
    set transaction isolation level  read committed;
    start transaction;
    select * from account;--发现a帐户是1000元,转到b窗口
    select * from account;--发现a帐户多了100,这时候,a读到了别的事务提交的数据,两次读取a帐户读到的是不同的结果(不可重复读)
  B窗口
    start transaction;
    update account set money=money+100 where name='aaa';
    commit;--转到a窗口

3、当把事务的隔离级别设置为repeatable read(mysql默认级别)时,会引发虚读,但避免了脏读、不可重复读
  A窗口
    set transaction isolation level repeatable read;
    start transaction;
    select * from account;--发现表有4个记录,转到b窗口
    select * from account;--可能发现表有5条记录,这时候发生了a读取到另外一个事务插入的数据(虚读)
  B窗口
    start transaction;
    insert into account(name,money) values('ggg',1000);
    commit;--转到a窗口

4、当把事务的隔离级别设置为Serializable时,会避免所有问题
  A窗口
    set transaction isolation level Serializable;
    start transaction;
    select * from account;--转到b窗口

  B窗口
    start transaction;
    insert into account(name,money) values('ggg',1000);--发现不能插入,只能等待a结束事务才能插入

参考

https://www.cnblogs.com/fjdingsd/p/5273008.html

https://www.jb51.net/article/76654.htm

https://www.cnblogs.com/xdp-gacl/p/3984001.html

免责声明:文章转载自《MySQL事务隔离级别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇黄聪:PHP字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、切割成数组等)字符集编码 定长与变长下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

html5实现web app摇一摇换歌

微信可以摇歌曲,根据声音识别出歌曲,然后返回歌曲信息,利用html5的deviceOrientation特性和deviceMotion事件也可以在web app上实现类似于微信摇一摇的功能,原生的app实现也有相关接口,这里只考虑web app的情况...... Section One 先来看下demo效果图: 测试地址:http://hcy2367...

Python接口自动化(三)post请求四种传送正文方式

HTTP协议规定POST提交的数据必须放在消息主题(entity-body)中,但协议并没有规定数据必须使用什么编码方式。 浏览器行为:Form表单提交 Http协议行为:Http1.1协议   我们知道,HTTP协议是以ASCII码传输,建立在TCP/IP协议之上的应用层规范。规范把HTTP请求分为三个部分:状态行、请求头、消息主体。 <meth...

Extjs4——表格控件

1.一个表格的简单形式: columns定义表格的结构,包括首部显示文本(header),列对应的记录集字段(dataIndex),列是否排序(sortable),列的渲染函数(renderer),宽度(width),格式化信息(format) data定义表格要显示的数据(原始数据) store为数据存储对象,它负责将各种原始数据转换成Ext.data....

redis慢查询的简单认识和事务、订阅的认识

  有学习的小伙伴可以一起讨论有问题可以问我,微信 15321502296慢查询 阀值:规定的一个值 阈值:规定的一个范围 就是系统在执行命令前后计算每条命令的执行时间,当超过预设的阀值时,就见这条命令记录下来 slowlog-log-slower-than  微秒 1秒=1000毫秒=1000000微秒 0 记录所有命令 <0不进行记录 slowl...

图数据库

1、为什么需要图数据库 我们假设这样一种特殊的查询场景:找出开发商是XXX,小区绿化率大于30%,周边200米有大型超市,500米有地铁,1000米有三甲医院,2000米有升学率超过60%的高中,房价在800W以内,最近被经纪人带看次数最多的房子。 这可能是一个客户想要的房子,但是各位觉得有哪个产品可以支持么? 如果说我们用传统的关系型数据库,MySQL或...

【C#、csharp】HTTPGET,POST请求

HTTP定义了与服务器交互的不同方法,基本方法有GET,POST,PUT,DELETE,分别对于查,该,增,删。一般情况下我们只用到GET和POST,其他两种都也可以用GET和POST来实现,很多浏览器也只实现了GET和POST两种方法   GET:用户获取信息     安全的:不会对服务器上的数据进行修改,和破坏     幂等的:相同的请求所返回的结果相...