数据库隔离级别及脏读、不可重复读、幻读

数据库及SQL 专栏收录该内容
5 篇文章 0 订阅

一、数据库隔离级别


1.未提交读(Read uncommitted)

  • 未提交读,事务可以读取其他事务未提交的数据,存在脏读问题。

A事务中未提交的内容,在B事务中都可见。如果A事务回滚,B事务读到的数据就是脏数据。

 

2.已提交读(Read committed)

  • 事务只能看到其他事务已经提交的修改。

解决了脏读问题,但有不可重复读的问题,即同一个事务多次执行同样的查询语句不一样。

 

3.可重复读(Repeatable read)

  • 避免了不可重复读的问题,即能够保证在同一个事务中,多次执行相同的查询的结果是一样的(当前事务的不对该记录修改的前提下),但是存有幻读的问题。

 

4.可串行化(Serializable)

  • 所有的事务串行进行执行,会在读取的每一行数据都加上锁,可能导致大量的超时和锁争用。因为事务的串行执行,也就避免了幻读的问题。另外考虑到效率的问题,这种级别很少被使用。

 

二、脏读、不可重复读、幻读


1.脏读:

  • 指一个事务读了另外一个事务未提交的数据

 

2.不可重复读:

  • 在一个事务内读取表中的某一行数据,多次读取结构不同。

如在一个事务中,两次查询同一用户的剩余金额可能会不一样(由于另一个事务对该用户的金额进行了修改),这种问题被称为不可重复读。

 

3.幻读:

  • 是指一次事务里,多次查询后,结果集的个数不一致的情况。

一个事务查询某个范围的记录时,其他的事务在这个范围插入了新的记录,导致当前事务查询时会发现比之前查询多了一行记录,就像出现了幻觉一样,称为幻读。

 

 

隔离级别

脏读(Dirty Read)

不可重复读(NonRepeatable Read)

未提交读(Read uncommitted)

可能

可能

已提交读(Read committed)

不可能

可能

可重复读(Repeatable read)

不可能

不可能

可串行化(Serializable)

不可能

不可能

备注:

(1)在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);

(2)在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

(3)需要注意的是以上只是SQL的标准,在实现中并不一定按照标准来,如Innodb引擎通过MVCC(多版本并发控制)在REPEATABLE READ级别解决了幻读的问题。

(4)查看当前事务隔离级别命令:

SELECT @@tx_isolation;

(5)设置事务隔离级别的命令:

SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

 

 

  • 1
    点赞
  • 4
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值