首页 > 代码库 > 数据库隔离级别

数据库隔离级别

本文转自 http://singo107.iteye.com/blog/1175084

数据库有四种隔离级别,分别为 Read uncommitted,Read committed,Repeatable read,Serizable。     讲解围绕事务并发。                                                                                  

 √:会出现   ×:不会出现

隔离级别

脏读

不可重复读

幻读

Read uncommitted

Read committed

×

Repeatable read

×

×

Serializable

×

×

×

1、Read uncommitted  读未提交

  公司发工资了,领导把5000元打到tom的卡上,但是还未提交事务,这时tom查看自己的银行卡,发现自己多了工资5000元,心里想着为什么这次工资少了,但是这时老板发现给tom算错工资了,是10000元,于是事务回滚,将工资修改为10000元,tom再次查银行卡发现自己的工资是10000元,心里总算解闷了。

技术分享

  当隔离级别设置为Read uncommitted 时,容易出现脏读。

2、Read committed 读提交

  tom去超市购物,结账时系统读到卡里有10000元,而此时tom的老婆正在网上转账,把tom卡里的10000元转到了另一账户,并在tom前提交了事务,此时系统检查到tom的工资卡里已经没有钱了,tom非常纳闷,明明卡里有钱...

  当隔离级别设置为Read committed时,避免了脏读,容易出现不可重复读。大多数数据库的隔离级别设置为Read committed,如Sql Server,Oracle。怎样避免不可重复读,看下一个隔离级别。

3、Repeatable read

  当数据库的隔离级别设置为Repeatable read时,可以避免不可重复读,即tom拿着工资卡去消费,系统一旦读工资卡,tom的老婆就不能读工资卡了,tom的老婆也不能在此时转账。Repeatable read避免了不可重复读,但是有可能出现幻读。

   tom平时还挺节俭,tom的老婆在银行部门,她经常通过银行系统查看tom的消费记录。有一天,她查到tom的卡消费是80元,但是tom此时正在外面胡吃海喝,消费了1000元,tom的老婆打印账单时显示tom的消费记录是1080元,tom的老婆很诧异,以为出现了幻觉,幻读就这样产生了。

注: MySQL的隔离级别就是Repeatable read。

4、Serializable 序列化

  序列化是最高的事务隔离级别,同时花费代价也很高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅避免了脏读,不可重复读,而且避免了幻读。

数据库隔离级别