数据库事务并发问题----事务隔离

数据库事务并发问题

 1、脏读

  1. A将某条数据由50改为10;
  2. B读取数据为10;
  3. A回滚,数据恢复到了50;

     这个时候B读取的10就是一个无效的值(脏数据)。
 

 2、不可重复读

  1. A读取某条数据为50;

  2. B修改为20;

  3. A再读取为20,和第一次读取的不一致。

3、幻读

  1. A读取User表的一部分数据;

  2. B想User表写入了新的行;

  3. A再次读取User表,多了一些行。

这些现象中,脏读我们是不允许的。

 为了应对这些现象,数据库定义了事务的隔离级别(一个事务与其他事务的隔离程度称为隔离级别)

  • 读未提交:read uncommited

允许A读取B未提交的修改,在这种隔离级别下,脏读可能发生。

  • 读已提交:read commited

要求A只能读取B已经提交的修改,可能出现不可重复读、幻读

  • 可重复读:repeatable read

同一事务(A)期间,可以多次从一个字段中读取到相同的值,即A执行期间,禁止其他事务对这个字段进行更新。可能出现幻读

  • 串行化 serializable

确保同一个事务(A)可以从一个表中读取到相同的行,即在A执行期间,禁止其他事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分低下

隔离级别解决并发问题能力表
          脏读 不可重复读        幻读  
read uncommited 存在 存在 存在
read commited   存在 存在
repeatable read     存在
serializable      
不同数据库对事务隔离级别的支持,(实际上,MySQL在repetable read级别已经没有问题了)
  Oracle MySQL
read uncommited  
read commited
repeatable read   √ (默认)
serializable
 

猜你喜欢

转载自blog.csdn.net/weixin_44134725/article/details/111229350