MySQL中事务的隔离级别

MySQL中事务的隔离级别

    • 隔离级别(ISOLATION LEVEL)
    • 查看当前事物级别
    • 设置mysql的隔离级别
    • READ UNCOMMITTED(未提交读)
    • READ COMMITTED(读已提交)
    • REPEATABLE READ(可重复读)
    • SERIALIZABLE(可串行化)

隔离级别(ISOLATION LEVEL)

隔离性其实比想象要复杂。在SQL中定义了四种隔离的级别,每一种隔离级别都规定了一个事务中的修改,哪些是在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常来说能承受更高的并发,系统的开销也会更小。

查看当前事物级别

SELECT @@tx_isolation;

设置mysql的隔离级别

基本语法

set session transaction isolation level 事务隔离级别

READ UNCOMMITTED(未提交读)

在READ UNCOMMITTED级别,事务的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读(Dirty Read)。这个级别的隔离会导致很多问题,虽然在性能方面是最优的,但是缺乏其他级别的很多好处,所以这种隔离的级别很少在实际中应用。
READ UNCOMMITTED实践 开启两个MySQL SESSION,并将MySQL的默认隔离级别设置为READ UNCOMMITTED

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

在这里插入图片描述

READ COMMITTED(读已提交)

大多数数据库系统默认的隔离级别都是READ COMMITTED(但MySQL不是),"读已提交"简单的定义:一个事务只能看见已经提交的事务的修改结果。换句话说,一个事务从开启事务到提交事务之前,对其他事务都是不可见的,因此在同一个事务中的两次相同查询结果可能不一样。故这种隔离级别有时候也叫不可重复读(NONREPEATABLE READ)。
• READ COMMITTED 实践
在这里插入图片描述

REPEATABLE READ(可重复读)

"可重复读"是MySQL的默认事务隔离级别。REPEATABLE READ解决了脏读的问题,该级别保证了在同一次事务中多次查询相同的语句结果是一致的。但是"可重复读"隔离级别无法避免产生幻行(Phantom Row)的问题,MySQL的InnoDB引擎通过多版本并发控制(MVCC,Multiversion Concurrency Controller)解决了幻读的问题。
• REPEATABLE READ 产生幻行的实践

从上面GIF图显示的过程我们可以看到,最后SESSION A查询语句的结果只有一条id为1的数据,但是我们在插入id=2的数据的时候产生了报错
ERROR 1062 (23000): Duplicate entry ‘2’ for key ‘PRIMARY’
从报错中很容易就能看到是因为id=2的行已经存在了,前面读取行数据的结果就是幻读。
• REPEATABLE READ 实践
在这里插入图片描述

SERIALIZABLE(可串行化)

SERIALIZABLE是最高的隔离级别,它通常通过强制事务串行,避免了前面说的幻读问题。简单来说,"可串行化"会在读取的每一行数据上都加锁,所以可能会导致大量的锁等待和超时问题,所以在实际的生产环境中也很少会用到这个隔离级别,只有在非常需要确保数据的一致性切可以接受没有并发的情况下,才会考虑使用这个隔离级别。
• SERIALIZABLE实践
在这里插入图片描述

从上面的过程我们可以看到,"可串行化"是通过对每一行数据都加锁的方式来避免幻行问题,这种方式效率非常的低,很容易造成较长时间的锁等待。

你可能感兴趣的:(MySql,mysql,数据库)