首页 > 代码库 > 数据库隔离级别
数据库隔离级别
本文转自 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 序列化
序列化是最高的事务隔离级别,同时花费代价也很高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅避免了脏读,不可重复读,而且避免了幻读。
数据库隔离级别