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

oracle 事务 实现并发控制

原创 不吃草的牛_Nick 2023-06-05
352

数据库可使用一种或多种方法来实现使用的并发性。这些方法包括

  1. 保证由事务独占使用表的锁定机制,
  2. 允许事务串行化的时间戳方法,
  3. 以及基于验证的事务调度。

锁定方法称为悲观方法,因为它们假定事务将破坏串行调度,除非明确地阻止它们这样做。时间戳和验证方法称为乐观方法,因为它们不假定事务必然会破坏串行调度。

正如你所猜测,锁定方法导致比乐观方法更长时间的延迟,因为它们要求冲突的事务等待访问锁定的数据库对象。不过,从积极的方面来看,锁定方法不必中止事务,因为它们阻止了可能冲突的事务与其他事务相互影响。如果事务可能破坏串行调度,那么乐观的方法通常是要中止它们。

时间戳方法分配时间戳给每个事务,并通过保证事务时间戳与事务的时间表相匹配来强制实施串行化。验证方法维护事务的一个活动记录。在提交事务之前,针对所有当前活动事务的更改项,验证己更改的数据,消除非串行调度。

Oracle使用各种有效方法的组合。它使用锁与所谓多版本并发控制系统(时间戳方法的一个变种)管理并发。

Oracle的锁防止试图访问相同资源的事务之间的破坏性交互。资源可以是一个应用表或行,或者可以是内存中的一个共享系统数据结构,还可以是一个数据字典表或行。在同意多个用户同时访问数据库从而允许数据并发时,锁保证数据一致性。

Oracle隐式地进行锁定,用户不必担心锁定哪个表或如何锁定,Oracle会在必要时代表事务自动地进行锁定。默认时,Oracle使用行级锁定,这种锁定的数量限制最少,因此能保证最大的并发处理。Oracle默认在数据块中存储锁定行的信息。而且Oracle从不使用锁升级,即不会将较低的粒度(如行级锁定)升到较高的粒度(如表级锁定)。

Oracle的多版本并发控制系统是并发控制的时间戳方法的一个变种,它维护表数据的旧版本,以保证任意事务都可以读出原始数据,即使它己经被其他事务更改过。与锁定不一样,这里没有等待;事务使用相同表的不同版本,而不用等待其他事务完成对表的处理。

如果事务想更新一行,Oracle首先把原来的前像写到撤销表空间的一个撤销记录中。这样,查询得到数据的致性视图(这提供了读一致性),它们只看到单个时间点的数据。使用相同的机制,Oracle还能提供事务级的读一致性,这表示事务中所有独立的语句都看到来自单个时间点的数据。Oracle使用的多版本并发控制系统可釆用较不严格的己提交读隔离模式,而不必采用较慢但较安全的串行隔离级别。

Oracle锁定的一些重要特性。

  1. Oracle通过在被锁定的数据项中设置一个二进制位实现锁。此锁定信息保存在行所在的数据块中。
  2. 锁的持有针对一个事务的整个过程,在发出COMMIT或ROLLBACK语句时才释放。
  3. Oracle不使用锁升级。Oracle不需要升级锁,因为它在个别的数据块中存储锁信息。锁升级(例如从行级到表级)会降低并发性。
  4. Oracle不使用锁转换。锁转换涉及改变锁的限制而同时保证锁的粒度相同。例如,当SELECTFORUPDATE语句开始更新表中以前锁定的行时,行共享表锁转换为限制性更强的行独占表锁。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论