图说事务隔离级别

 

    我们经常说的事务隔离级别,一般指的是SQL-92标准中定义的四个级别。分别是:

 

  • Read Uncommitted 未提交读
  • Read Committed 提交读
  • Repeatable Read 可重复读
  • Serializable 序列化

 

  • Read Uncommitted 未提交读

    事务A更新了数据,但没有提交(commit),允许事务B读到这条变化的数据。如果事务A最终没有提交,而是rollback回原来的状态,那么事务B读到的数据就是一条脏数据。

 

图1 未提交读

 

  • Read Committed 提交读

    事务A在更新数据并且提交后,才允许事务B读取到,这样就可以避免脏读。

 

图2 提交读

 

    Read Committed并不能防止不可重复读和幻读,什么是不可重复读和幻读?看下图

 

    不可重复读是事务B在多次读取数据过程中,事务A对数据进行更新或者删除,导致事务B前后读到的数据不一致。

 

图3 不可重复读

 

    幻读是事务B在多次读取过程中,事务A对数据新增了,导致事务B后读的数据比之前读的多了,感觉像是凭空出来的一样。

 

图4 幻读

 

  • Repeatable Read 可重复读

图5 可重复读

 

    显然,要实现可重复读,需要事务B在读取数据后,对SELECT的数据加锁,事务A不能修改,这可以通过“共享读锁”和“排它写锁”来实现。可重复读不能避免幻读。

 

  • Serializable 序列化

    提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。这样可以避免幻读,但是,这样的事务级别,性能也最差。

 

图6 序列化事务

 

下面是隔离级别及其对应的可能出现或不可能出现的现象

 

Dirty Read 

NonRepeatable Read 

Phantom Read 

Read uncommitted

Possible

Possible

Possible

Read committed

Not possible

Possible

Possible

Repeatable read

Not possible

Not possible

Possible

Serializable

Not possible

Not possible

Not possible

 

 

参考:http://epub.itpub.net/3/4.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值