mysql 第8.13章 事务-说说脏读、不可重复读、幻读,怎么解决的 mysql 第8.13章 事务-说说脏读、不可重复读、幻读,怎么解决的

9小时前

在数据库事务管理中,脏读、不可重复读和幻读是三种典型的并发问题。每种问题都与事务的隔离级别有关,通过调整事务隔离级别可以解决这些问题。

一、脏读

(Dirty Read)

定义:脏读是指一个事务可以读取另一个事务尚未提交的修改。如果该事务回滚,则第一个事务所读取的数据将无效。

场景:

  • 事务 A 修改了一条记录,但尚未提交。

  • 事务 B 读取了这条未提交的记录。

  • 事务 A 之后回滚,撤销了修改。

  • 此时,事务 B 读取的数据是无效的,即脏数据。

解决办法:通过设置 READ COMMITTED 或更高级别的事务隔离级别可以避免脏读。常见的隔离级别有:

  • **READ COMMITTED**:只允许读取已提交的修改,从而防止脏读。

二、不可重复读

(Non-repeatable Read)

定义:不可重复读是指在同一个事务中多次读取同一数据时,读到的数据不一致。因为在两次读取之间,另一个事务可能已经修改并提交了该数据。

场景:

  • 事务 A 读取一条记录。

  • 事务 B 修改了这条记录并提交。

  • 事务 A 再次读取这条记录,发现内容已发生变化,无法保证数据的重复读取一致性。

解决办法:通过设置 REPEATABLE READ 隔离级别可以防止不可重复读。

  • **REPEATABLE READ**:事务在开始时所读取的数据在整个事务期间保持一致,避免了不可重复读。

三、幻读

(Phantom Read)

定义:幻读是指在一个事务中,两次相同的查询条件可能返回不同的结果集,第一次查询后,另一个事务插入了新记录,导致第二次查询出现“幻影”数据。

场景:

  • 事务 A 读取一组符合条件的记录。

  • 事务 B 插入了一条新记录,并提交。

  • 事务 A 再次读取相同的条件,发现多了一条记录,即幻读。

解决办法:通过设置 SERIALIZABLE 隔离级别可以防止幻读。

  • **SERIALIZABLE**:最严格的隔离级别,保证事务之间完全串行执行,避免幻读问题。

四、各个事务隔离级别

**READ UNCOMMITTED**(未提交读):允许脏读、不可重复读、幻读。

**READ COMMITTED**(提交读):防止脏读,但允许不可重复读和幻读。

**REPEATABLE READ**(可重复读):防止脏读和不可重复读,但允许幻读。

**SERIALIZABLE**(可串行化):防止脏读、不可重复读和幻读,但性能较差。

五、总结

脏读:事务读到了未提交的数据,通过 READ COMMITTED 解决。

不可重复读:同一事务多次读取同一数据结果不一致,通过 REPEATABLE READ 解决。

幻读:同一事务多次查询结果集不一致,通过 SERIALIZABLE 解决。

在实际应用中,根据业务需求选择合适的隔离级别,平衡性能与数据一致性。

阅读 12

mysql文章
带到手机上看