MySQL提供了四种事务隔离级别,分别是:
- 读未提交(Read Uncommitted):一个事务可以读取另一个事务尚未提交的数据。这个级别没有实现任何一种隔离。最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- 读已提交(Read Committed):一个事务只能读取其他事务已经提交的数据。这个级别可以避免脏读,但可能会出现不可重复读和幻读的问题。
- 可重复读(Repeatable Read):一个事务在执行期间多次读取同一行数据时,保证返回的结果是一致的,即读取到的数据与该事务开始时的状态相同。这个级别可以避免脏读和不可重复读,但可能会出现幻读的问题。
- 串行化(Serializable):最高级别的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。在该级别下,每个事务都必须等待另一个事务完成后才能进行操作。这个级别可以避免所有并发问题,但是对性能影响较大。
需要注意的是,随着隔离级别的升高,数据库的并发性能会逐渐降低,因此应该根据实际情况进行选择和优化。通常情况下,推荐使用可重复读隔离级别,因为它可以避免大部分并发问题,并且性能表现也比较优秀。
事务隔离级别 | 读数据一致性 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
读未提交(read-uncommitted) | 最低级被,只能保证不读取物理上损坏的数据 | 是 | 是 | 是 |
读已提交(read-committed) | 语句级 | 否 | 是 | 是 |
可重复读(repeatable-read) | 事务级 | 否 | 否 | 是 |
串行化(serializable) | 最高级别,事务级 | 否 | 否 | 否 |
MySQL的默认事务隔离级别是 Repeatable read 可重复读!不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)