暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle 改变默认隔离级别

原创 不吃草的牛_Nick 2023-06-08
412

改变默认隔离级别
Oracle的已提交读隔离级别提供了对脏读和更新丢失的保护,因为査询只读取COMMIT语句执行后的数据。事务在每个语句的级别上都是一致的。读命令不会阻塞事务的写命令,反之亦然。正如所见,Oracle的默认己提交读隔离级别不能保证避免不可重复读和幻读问题.Oracle只保证语句级而不是事务级的读一致性。但是,Oracle可以选择串行隔离级别直接改变默认的已提交读隔离级别。

注解 已提交读隔离级别大大提高了数据库的并发性和一致性。但是,该模式不提供事务级的一致性.因为它是语句级的隔离,所以,查询可能看不见在一个事务的语句之间所做的更改,因此,不可重复读问题将继续存在;如果重复执行查询,不能保证每次的结果相同。也会潜在幻读问题,因为该模式不能阻止其他事务处理在几个查询之间更新表。

串行隔离级别将把数据库处理为单用户数据库,从而消除了同时使用和修改数据所导致的数据异常。使用ALTER SESSION语句,可使隔离级别串行化,从而避免并发性问题。可使用如下语句,将隔离级别从默认的已提交读级别更改为串行隔离级别:
ALTER SESSION SET ISOLATION LEVEL SERIALIZABLE;

一旦执行了此语句,可以保护自从你设置的事务以来所发生所有已提交和未提交的事务。还可使用SET TRANSACTION READ ONLY 命令代替串行隔离级别,提供无幻读数据的可重复读。隔离的串行级别适合于在一个更新事务处理过程中有多个一致性査询的数据库。但是,不要轻易选择串行性,因为它严重降低并发性。

以下是设置串行隔离级别所涉及的一些问题。

  1. 由于串行要锁定表以供事务独占地使用,从而降低事务的并发性。
  2. 为使串行隔离级别起作用,在创建表时表的INITTRANS参数必须至少设置为3。INITTRANS参数决定一个表上并发事务的数目。
  3. 串行隔离级别的吞吐量比已提交读隔离级别的要低很多,特别是在有许多事务更新相同的表的高并发数据库中更是如此。
  4. 如果要使用隔离的串行模式,必须在应用程序中包含错误检査代码。
  5. 串行事务更容易死锁,死锁是事务互相等待释放数据对象上的锁的一种情况。死锁将导致代价很高的事务回滚。

一般情况下,最安全的办法是利用Oracle事务默认的已提交读隔离级别,尽管它并不完善。Oracle建议使用默认的己提交读隔离级别,它带来最大的吞吐量,遇到不可重复读和幻读异常的可能性很小。

已提交读隔离级别很好地权衡了数据并发性和数据一致性。而且,这种隔离级别的吞吐量比纯粹的串行方式大得多。如果使用串行隔离级别的主要目的是得到可重复读,则可在需要的地方使用显式锁。

对于标准的OLTP应用,尤其是对那些高容量、并发、生存周期短、互相之间不可能冲突的事务来说,从性能的观点看这种方式是很理想的。在OLTP数据库中很少有事务多次发布相同的查询,因此幻读和不可重复读很少见。并发性的串行方式更适合于长时间主要运行只读事务的数据库。


事务级和语句级一致性
Oracle默认地自动提供语句级读一致性,即一个查询看到的所有数据都来自单个时间点。这意味着一个査询开始后将看到一致的数据。查询只看到它开始前己提交的数据,看不到査询过程中提交的数据。在此环境中的査询不一定是SELECT语句,一个带子査询的INSERT语句、UPDATE或DELETE语句也涉及隐式査询,它们全都返回一致的数据。

Oracle也可以提供事务级的读一致性,只不过不是默认的。Oracle可使用存储在撤销段中的预先改变的数据映像来提供事务级和语句级的读一致性。


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论