ISO事务标准使用术语隔离级别(isolation level)来表示数据库允许事务之间相互影响的程度。隔离定义了由一个操作所引起的变化在何时并如何对数据库中其他的并行操作可视。其他事务的隔离使并发执行的数据库事务看不到其他事务的未完成的结果。主要的隔离级別包括串行、可重复读、未提交读和已提交读。
- 串行:在隔离的串行级别下,所有事务相互之间完全隔离,就好像事务处理以串行方式一个接一个地执行一样。在隔离的串行级别下,执行插入、删除或更新的事务在受DML操作影响的一组数据上放置一个写锁。在隔离事务释放其锁之前,即在该事务处理被提交或回滚时,数据库领定受影响的数据。由于涉及DML操作的其他事务不得不等待颌解除,故那些事务不会读任何"脏"数据。隔离的串行级别还帮助你避免不可重复读,因为随后的事务处理不能更新或删除锁定的数据。由于后面的事务处理不能在第一个事务处理锁定的数据范围内插入任何新行,从而摆脱了幻读数据。
- 可重复读:可重复读隔离级别保证读一致性,即一个事务在两个不同的时间点从一个表中读数据两次,每次都得到相同的值。这个级别的隔离避免了脏读和不可重复读问题。
- 未提交读:未提交读级别允许事务读取其他事务未提交前的中间值,它可能会导致并发使用的所有问题。
- 已提交读:Oracle的默认隔离级别是语句级的已提交读隔离级别。Oracle査询只能看到査询开始时巳提交的数据。因为此隔离级别是语句级的,所以每条语句只允许看到该语句开始前己经提交的数据。隔离的已提交读级别保证在访问Oracle表中特定的行时,该行的数据不会改变。
注解 如果你正在更新从游标中获取的一行数据,则可以保证没有其他人同时更新该相同的行。但是,如果你正在执行查询,而其他事务在你查询期间成功地更新了数据,你可能会每次得到不同的值.请记住,Oracle只保证语句级的隔离,不保证事务级的隔离.
现实中的数据库需要在并发访问和串行操作模式之间进行平衡。这里,关键的问题是,指定高级别的隔离,阻止一个事务影响另一个事务,但代价是使数据库的性能严重退化。另一方面,低级别的事务隔离将引出本章中介绍的数据问题,但得到更好的性能。运行在串行隔离级别的事务似乎是独自运行--其他的并发事务或者在它之前执行,或者在它之后执行。
各种隔离级别下可能出现的并发问题
表中是表示在相应的隔离级别下可能产生特定的问题
否表示在该隔离级别下不会产生问题。
| 隔离级别 | 脏 读 | 不可重复读 | 幻 读 |
|---|---|---|---|
| 未提交该 | 是 | 是 | 是 |
| 已提交读 | 否 | 是 | 是 |
| 可重复读 | 否 | 否 | 是 |
| 串行 | 否 | 否 | 否 |
串行级别,避免了所有并发问题,但很遗憾,它不是一个实际可行的选择,因为它不允许并发使用数据库。Oracle的默认已提交读隔离级别可摆脱脏读和更新丢失问题。之所以它能摆脱脏读问题是因为査询只读取査询开始时已提交的数据,从而避免了读取稍后可能被另一事务回滚的数据。此外,由于事务在更新完成前不能读正在修改的数据,所以避免了更新丢失问题。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




