2024年9月9日至12日,Oracle CloudWorld在美国拉斯维加斯隆重举行。这场盛会聚集了来自全球的技术领袖和行业专家,讨论了如何通过Oracle的最新技术创新推动企业的数字化转型。在这一系列会议中,Oracle事务和应用开发技术副总裁Ajit Mylavarapu、Paragon Data公司高级DBA Christian Trieb、数据和内存技术高级副总裁 Tirthankar Lahiri一起带来了关于下一代事务发展和实现的专题演讲。
专题演讲主要讨论了在现代应用对连接无状态、应用可扩展性和容错性需求下,Oracle下一代事务技术包含的核心创新功能,包括:使用无会话事务创建无状态的轻量级现代应用程序,了解自我优化撤消如何保持事务平稳运行;无锁保留如何提高热数据的并发性,从而提高系统效率;通过优先级事务可限制关键事务的等待时间,确保关键操作的及时性;深入研究了事务隔离如何增强数据库容错性来应对中断,最终促进广大的Oracle用户利用事务管理领域的这些突破性进步转变您的数据库策略。
会议主题
Oracle技术副总裁Ajit Mylavarapu的演讲从当前应用面临的主要需求谈起:即无状态化、可扩展性和弹性的需求,在这些需求下,如何确保事务的原子性、一致性、隔离性和持久性(ACID)特性,并且和Christian Trieb、Tirthankar Lahiri一起针对这些具体需求结合示例代码进行了深入讲解了三个主题:无状态协议、可扩展性和容错性。

图1:当前应用的需求
主题一:无状态协议
Ajit Mylavarapu针对无状态协议,主要谈了两个方面的内容:应用无状态化和Oracle无会话事务技术;基于值的并发控制和Oracle Database 23ai中新的无锁并发控制技术。
应用无状态化
针对当前应用连接的无状态要求,Ajit Mylavarapu首先强调了关键应用通常需要完成复杂的在线事务处理过程,并且交互式事务运行在不同的数据库调用中进行应用逻辑检查,并且给出了一个典型的交互式事务的业务流程。

图2:无会话事务及典型流程
在这个典型的交互式事务过程中,通常下面几个原因导致系统效率低下:
事务提交前,连接和会话长时间存在 因为大量的时间被用于业务检查,连接通常有非常低的利用率 连接不能被其他事务复用
现有的解决方法通常是采用XA事务来解决该类问题,XA协议采用两阶段提交(2PC, Two-Phase Commit)方式来管理分布式事务,确保所有资源同时提交或回滚,但这也带来新的问题:
性能开销较大,因为需要协调多个资源的管理
需要使用中间层XA事务协调器
实现复杂
故障难以调试,并可能导致系统范围的中断
无会话事务(Sessionless Transactions)
为了解决上述问题,Ajit Mylavarapu给出了Oracle公司的下一代事务的解决方案:无会话事务

图3 :无会话事务
无会话事务为应用程序启用无状态模型
在执行工作单元后,可以暂停无会话事务
可以恢复暂停的交易
数据库保留行锁,因此应用程序不需要验证以前的语句
无需协调XA事务
可以在对数据库的调用之间释放连接和会话资源
通过一个典型的两个会话交互流程中可以看到,在会话1开始无会话事务过程中,当进行业务检查时,会话1可以设置为挂起状态,当业务检查完成后,在会话2中可以重启会话1中挂起的事务,从而避免会话和连接的长时间存在。

图4:无会话事务典型流程
采用无会话事务的优势:
使用无会话事务,Oracle数据库本身可以跨RAC集群管理单个事务 无需XA协议 无需在TM中管理分支信息 无需协调两阶段提交 无需复杂的恢复机制 无需TM事务管理器 允许对会话和连接进行多路复用
Ajit Mylavarapu 也在演讲中给出了采用无会话事务的代码示例,详细的说明了编码过程。

图5:无会话事务代码示例
基于值的并发控制技术:无锁(lock-free)并发控制
为了满足应用的无状态化需求,除了应用开发上采用的无会话事务,Oracle Database 23ai数据库提供了新功能——无锁并发控制。

图6:基于值的并发控制:lock-free
传统的基于锁的并发控制不符合当前应用的无状态API调用方式,具有以下弊端:
无状态 API 因其可扩展性和简单性而被广泛使用 HTTP的 GET 和 PUT 操作是无状态 API 事务和锁不能跨越完全无状态的调用
无锁并发控制采用了与传统基于锁的不同实现方式。众所周知,在 HTTP 协议中,ETAG(Entity Tag)是网页内容的签名或指纹,Oracle 创造性的将 HTTP ETAG 扩展到核心数据库中,以实现无锁并发控制。其原理是:当从数据库中读取行时,您可以选择同时读取所选数据的 ETAG。当将修改后的行写回数据库时,数据库验证基础行是否仍与读取计算的 ETAG 匹配,如果行与 ETAG 匹配,则以原子方式更新这些行,否则,另一个用户已更改数据,写入操作将被拒绝,可以使用新数据重试写入,其工作原理如下图所示:

图7:无锁并发控制工作原理
无锁并发控制作为基于值的并发控制技术,具有以下特点:
ETAG 并发控制是基于数据值的 通过检查数据值本身来检测冲突的更新 不是通过向数据添加锁或版本方式来控制并发访问
最后,Ajit Mylavarapu也给出了如何在关系数据中使用基于值的并发控制的示例代码。值得注意的是,ETAG的值既可以用于单行的校验,也可以用于多行校验。

图8:关系数据基于值的并发控制
主题二:可扩展性
在更新低基数表的事务上下文中,通常会出现可扩展性问题,并且会随着并发性而呈指数增长。想象一下一个电子商务应用程序,每次购买该产品时,它都会更新该产品的单位数。通常,大量的并发会话会尝试更新低基数表,以减少给定产品的单位数。这会导致可扩展性问题,因为每个并发会话都需要获取库存表中特定行的独占锁。使用传统锁定机制很难缓解这种情况。
无锁保留功能引入了“日志表”的概念:我们不是更新行,而是在日志表中插入新行,从而避免锁定要更新的行。提交时,需要独占锁才能实际更新行。但由于它只是“提交时”,因此锁会很快释放。通过该技术消除了在频繁更新的数据中消除热点块带来的性能影响。

图9:Oracle Database 23ai新功能——无锁保留
无锁保留是如何工作的?无锁保留允许事务同时对同一行的保留列进行加或减操作,而无需通过指定更新可以进行的条件来相互阻止。这是通过指定数字列为保留列并为该列创建 CHECK 约束来实现的。保留列更新不会锁定行,因此不会阻止另一个事务同时更新同一行的不可保留列。
Ajit Mylavarapu 用一个简单的例子来说明无锁保留的实现机制。该示例中假设库存商品数量QOH列中有100件商品,并且QOH列被标记为RESERVABLE属性,则对该列的更改将保留到对应日志表中,该日志在对该列更新时将记录已提交和可用的商品数量。示例中涉及T1、T2和T3时间段内的三个事务,其执行流程如下:
在T1时间,事务1开始执行,QOH被减少50件,因此对应日志表中QOH列 [已提交数量,可用数量] 从 [100, 100] 变更为 [100,50] 在T2时间,事务2中对QOH列又减少30件,此时日志表中QOH列变更为 [100, 20] ,当T2此时提交更改时,对应日志变更为 [70, 20] 在T3时间,事务3中对QOH列继续减少50件,由于此时 [70, 20] 中实际可用的数量为20,如果减少50件后无法满足约束条件库存数量应大于等于0,因此该事务更新失败,产生回滚。 最后,事务1发起提交时,由于当前日志为 [70,20] ,即已提交的数量将从70减少到20,符合约束条件库存数量大于等于0,因此提交成功。

图10:无锁保留实现机制
新一代无锁保留技术具有以下特点:
为聚合操作引入 RESERVABLE 列属性以及可选的 CHECK 约束规范 对发生变化的保留列数值通过日志进行记录 在日志表中跟踪保留列的变化 不会锁定保留列值 查询日志表以根据可保留列和待处理保留约束满足情况来允许/拒绝对保留列的更改。 仅在执行实际更新时,即只在事务提交期间获取锁
无锁保留语法可以通过RESERVABLE属性在CREATE TABLE语法中定义对应的列的保留属性及其约束检查条件,并且也可以通过ALTER TABLE语句对已有表增加列或者修改列的保留属性,详细语法如下图:

图11:无锁保留语法
测试表明,在电商类高并发的交易中,通过无锁保留可以实现在UPDATE列时事务吞吐率提升50倍,在TPC-C测试中事务吞吐率增加8倍。
主题三:容错性
在容错性部分,由Christian Trieb详细介绍了Oracle Database 23ai中新功能——优先级事务如何通过限制关键事务的等待时间确保关键操作的及时性。Tirthankar Lahiri讲解了关于23ai另一项新功能——事务隔离如何增强数据库容错性以应对业务中断。
优先级事务
Christian Trieb 从DBA在处理会话阻塞引起的数据库性能的常见过程讲起:当一个会话引起了其他事务不能执行时,该会话成为阻塞会话,DBA需要通过收集信息并分析来了解引起事务缓慢或者无响应的原因,确认阻塞会话后,通过alter system kill session命令杀掉阻塞会话,用户或开发人员重新执行语句来处理该类事件。

图12:优先级事务
通过优先级事务,阻塞会话不再需要DBA来确认,而是自动由系统终止阻塞会话,这一切都无需用户、开发人员和DBA进行处理。
优先级事务的设置需要在数据库级别通过alter system方式进行设置不同优先级事务的等待时间:

然后,通过alter session语句在会话级别进行设置事务的优先级别:

当事务被阻塞时,仅仅低优先级的事务被自动终止,高优先级的事务不会被自动终止。
当数据库检测到阻塞会话时,将等待 priority_txns_high/medium_wait_target 时间,如果阻塞事务有更低的优先级,则阻塞会话回滚,应用程序确认回滚状态。通过监控V$TRANSACTION和V¥SYSTATS视图可以监控优先级事务状态,当在此过程中事务回滚也会记录到alert日志中。
通过优先级事务功能,能够确保数据库更好的运行,减少DBA管理工作量。
事务隔离
最后,由Tirthankar Lahiri介绍了Oracle Database 23ai中另一个新功能:事务隔离。通过事务隔离,能够防范由于数据块错误引起问题,提高数据库的弹性容错能力。

图13:Oracle Database 23ai中新功能——事务隔离
在大规模系统中故障是常见的,一些故障会导致没有执行成功的事务要求事务恢复,也有导致数据库崩溃的情况。事务恢复无需用户进行干预,自动执行undo数据恢复到故障点前。
在事务恢复过程中,由于下面这些常见的数据块错误、丢失写和其他错误的存在:
物理数据库错误引起(ORA-01578, ORA-28304)报错 逻辑数据错误引起(ORA-00600)报错 内存故障引起(ORA-00602, ORA-07445)报错 语句故障引起 (ORA-00600)报错
这些错误常常会导致整个恢复过程的失败。为了防止由于当个恢复事务不可用导致数据库整个系统不可用,Oracle推出了下一代新技术:事务隔离。

图14:新技术——事务隔离
通过事务隔离技术,如果当事务恢复过程中出现故障,该事务会自动被隔离,恢复过程能继续恢复其他事务,从而防止确保系统级的恢复得以继续完成。未完成恢复的被隔离事务将报错信息发送到对应视图,管理员可以通过调查报错信息,修复报错并重新运行对应事务的恢复过程。
被隔离事务相关报错信息格式如下:

报错信息保存在DBA_OUTSTANDING_ALERTS和DBA_ALERT_HISTORY视图中,DBA能通过查询DBA_QUARANTINED_TRANSACTIONS视图中的所有被隔离的事务,然后确定是否手工恢复这些事务的执行。
在恢复完成后,被隔离事务能通过DDL语句从该视图删除对应被隔离事务记录。

总结
通过在本次Oracle CloudWorld 2024展示的下一代事务技术:无会话事务、无锁并发控制、无锁保留、优先级事务、事务隔离等,能够更好的满足当前应用无状态、可扩展性和容错性的需求,使得应用结合数据库能支持更多的并发能力、具有更好的扩展性和具有更高的弹性。





