MySQL8.0优化 - 事务的隔离级别

文章目录

  • 学习资料
  • 事务的隔离级别
    • 脏读、不可重复读、幻读
      • 脏读(Dirty Read)
      • 不可重复读(Non-Repeatable Read)
      • 幻读(Phantom)
    • SQL中的四种隔离级别
      • 读未提交(READ UNCOMMITTED)
      • 读已提交(READ COMMITTED)MySQL默认
      • 可重复读(REPEATABLE READ)
      • 可串行化(SERIALIZABLE)
      • 不同隔离级别下的问题
    • MySQL支持的四种隔离级别


学习资料

【MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!-哔哩哔哩】
【阿里巴巴Java开发手册】https://www.w3cschool.cn/alibaba_java

事务的隔离级别

MySQL是一个客户端/服务器,对于同一个服务器来说,可以u若干个客户端之连接,每个客户端与服务器连接上后,就可以称为一个会话(Session)。每个客户端都可以在自己的会话中向服务器发送请求语句,一个请求语句可能是某个事务的一部分,也就是对于服务器来说可能同时处理多个事务,事务有隔离性的特性,理论上在某个事务对某个数据进行访问时,其他事务应该进行排队,当该事务提交之后,其他事务才可以继续访问这个数据。但这样对性能影响太大,我们即想保持事务隔离性,又想让服务器在处理访问同一数据的多个事务性能尽量高些,那就看二者如何权衡取舍了。

脏读、不可重复读、幻读

脏读(Dirty Read)

对于两个事务Session A、Session B、Session A读取了已经被Session B更新但还没有被提交的字段时。之后若Session B回滚,Session A读取的内容就是临时且无效的。

不可重复读(Non-Repeatable Read)

对于两个事务Seesion A、Session B,Session A读取了一个字段,然后Session B更新了该字段。之后Session A再次读取同一个字段,值就不同了。那就意味着发生了不可重复读。

幻读(Phantom)

对于两个事务Session A、Session B,Session A从一个表中读取一个字段,然后Session B在该表插入了一些新的行。之后,如果Session A再次读取同一个表,就会多出几行,那就意味着发生了幻读。

SQL中的四种隔离级别

读未提交(READ UNCOMMITTED)

READ UNCOMMITTED:读未提交,该隔离级别,所有事务都可以看到其他未提交事务的执行结果。不能避免脏读、不可重复读、幻读。

读已提交(READ COMMITTED)MySQL默认

READ COMMITTED:读已提交,它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这是大多数数据库系统的默认隔离级别。可以避免脏读,但不可重复读、幻读问题仍然存在。

可重复读(REPEATABLE READ)

REPEATABLE READ:可重复读,事务A在读到一条记录之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容。可以避免脏读、不可重复读,但幻读问题仍然存在。这是MySQL的默认隔离级别。

可串行化(SERIALIZABLE)

SERIALIZABLE:可串行化,确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除的操作。所有的并发问题都可以避免,但性能十分低下。能避免脏读、不可重复读和幻读。

不同隔离级别下的问题

SQL标准中规定,针对不同的隔离级别,并发事务可以发生不同严重程度的问题,具体情况如下:
MySQL8.0优化 - 事务的隔离级别_第1张图片
脏写怎么没涉及到?因为脏写这个问题太严重了,不论哪种隔离级别,都不允许脏写的情况发生。
不同的隔离级别有不同的现象,并有不同的锁和并发机制,隔离级别越高,数据库的并发性能就越差,4种事务隔离级别与并发性能关系如下:
MySQL8.0优化 - 事务的隔离级别_第2张图片

MySQL支持的四种隔离级别

不同的数据库厂商对SQL标准中规定的四种隔离级别支持不一样。比如,Oracle就支持READ COMMITTED(默认隔离级别)SERIALIZABLE隔离级别。MySQL支持4种隔离级别,但与SQL标准中所规定的各级隔离级别允许发生的问题却有些出入,MySQL在REPEATABLE READ隔离级别下,是可以禁止幻读的问题发生的。

MySQL的默认隔离级别为REPEATABLE READ,在MySQL8.0中默认隔离级别为READ COMMITTED

# 查看隔离级别,MySQL5.7.20的版本及之后;
SHOW VARIABLES LIKE 'transaction_isolation';

# 不同MySQL版本中都可以使用的;
SELECT @@transaction_isolation;

MySQL8.0优化 - 事务的隔离级别_第3张图片

你可能感兴趣的:(MySQL8.0从入门到高级,java,数据库,服务器)