头图

数据库允许多个客户端同时访问。当这些客户端并发访问数据库中同一部分的数据时,如果没有采取必要的隔离措施就容易造成并发一致性问题,从而破坏数据的完整性。考虑下图的场景:
image.png

在时间点1上,var的数值是100。客户端A在时间点2的时候更新了它的值为200,但没有提交事务。在时间点3的时候,客户端B读取到了客户端A还未提交的数值200。但在时间点4,客户端A执行了回滚操作。那么,对于客户端B来说,如果在时间点5再次读取数据,得到就应该是100。那么客户端B就有了数据不一致的问题。而造成问题的根本原因在,客户端B读取到了客户端A还没有提交的事务中的数据。

视频讲解如下:
https://www.bilibili.com/video/BV1BB4LzoEA9/?aid=115347655171...

为了解决数据在并发访问时,数据的一致性问题。MySQL数据库提供了四种事务的隔离级别,它们分别是:读未提交(READ-UNCOMMITTED)读已提交(READ-COMMITTED)可重复读(REPEATABLE-READ)可序列化读(SERIALIZABLE)。执行下面的语句可以得到MySQL默认的事务隔离级别是可重复读。

mysql> show variables like '%isolation%';

# 输出的信息如下:
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+

下面的语句将修改MySQL数据库的事务隔离级别为:READ UNCOMMITTED。

mysql> set session transaction isolation level read uncommitted;

MySQL数据库在不同的事务隔离级别下会有不同的行为,从而在并发访问数据的时候会带来不同的问题。下表列举了在不同的事务隔离级别下,MySQL可能存在的不同问题。
image.png


赵渝强老师
36 声望17 粉丝

20年以上的IT行业从业经历,清华大学计算机软件工程专业毕业,京东大学大数据学院院长,Oracle中国有限公司高级技术顾问;曾在BEA、甲骨文、摩托罗拉等世界500强公司担任高级软件架构师或咨询顾问等要职,精通大...