当前位置: 代码迷 >> 综合 >> 数据库知识梳理——事务的隔离级别(脏读、幻读、不可重复读)
  详细解决方案

数据库知识梳理——事务的隔离级别(脏读、幻读、不可重复读)

热度:17   发布时间:2023-12-29 08:55:41.0

MySQL 的默认事务隔离级别是 Repeatable Read(可重复读)。
Oracle 的默认事务隔离级别是 Read Committed(读已提交)。

同一个应用程序中的多个事务或不同应用程序中的多个事务在同一个数据集上并发执行时, 可能会出现许多意外的问题,这些问题可分为如下三种类型:

脏读(Drity Read):

已知有两个事务A和B, A读取了已经被B更新但还没有被提交的数据,之后,B回滚事务,A读取的数据就是脏数据。
例子:银行卡原有1000元,A向银行卡转账1000元,B读到2000元,A发现转错了,B回滚事务后A再查询结果又变成1000元,之前读到的2000元就是脏数据

不可重复读(Non-repeatable read):

已知有两个事务A和B,A 多次读取同一数据,B 在A多次读取的过程中对数据作了修改并提交,导致A多次读取同一数据时,结果不一致。

幻读(Phantom Read):

已知有两个事务A和B,A从一个表中读取了数据,然后B在该表中插入了一些新数据,导致A再次读取同一个表, 就会多出几行,简单地说,一个事务中先后读取一个范围的记录,但每次读取的纪录数不同,称之为幻读

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
 

  相关解决方案