2团
Published on 2024-08-15 / 9 Visits
0
0

数据库事务隔离级别

本文节选自《高性能MySQL》一书。

1. READ UNCOMMITTED(未提交读)

在 READ UNCOMMITTED级别,在事务中可以查看其他事务中还没有提交的修改。这个隔离级别会 导致很多问题,从性能上来说,READ UNCOMMITTED不会⽐其他级别好太多,却缺乏其他级别的很多好处,除⾮有⾮常必要的理由,在实际应⽤中⼀般很少使⽤。

读取未提交的数据,也称为脏读( dirty read )。

2. READ COMMITTED(提交读)

⼤多数数据库系统的默认隔离级别是 READ COMMITTED(但 MySQL 不是)。READ COMMITTED 满⾜前⾯提到的隔离性的简单定义:⼀个事务可以看到其他事务在它开始之后提交的修改,但在该 事务提交之前,其所做的任何修改对其他事务都是不可⻅的。这个级别仍然允许不可重复读(nonrepeatable read),这意味着同⼀事务中两次执⾏相同语句,可能会看到不同的数据结果。

3. REPEATABLE READ(可重复读)

REPEATABLE READ解决了READ COMMITTED级别的不可重复读问题,保证了在同⼀个事务中 多次读取相同⾏数据的结果是⼀样的。但是理论上,可重复读隔离级别还是⽆法解决另外⼀个幻读(phantom read )的问题。所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外⼀个事务⼜在该范围内插⼊了新的记录,当之前的事务再次读取该范围的记录时,会产⽣幻⾏(phantom row)。

InnoDB 和 XtraDB 存储引擎通过多版本并发控制(MVCC ,Multiversion Concurrency Control)解决了幻读的问题。

REPEATABLE READ 是 MySQL 默认的事务隔离级别。

4. SERIALIZABLE(可串行化)

SERIALIZABLE是最⾼的隔离级别。该级别通过强制事务按序执⾏,使不同事务之间不可能产⽣冲突,从⽽解决了前⾯说的幻读问题。简单来说,SERIALIZABLE会在读取的每⼀⾏数据上都加锁,所以可能导致⼤量的超时和锁争⽤的问题。实际应⽤中很少⽤到这个隔离级别,除⾮需要严格确保数据安全且可以接受并发性能下降的结果。

5. 汇总

image-rdec.png


Comment