事务介绍
事务是包含一个或多个 SQL 语句的逻辑的、 原子的工作单元。
-
原子性
事务中的所有任务, 要么全部执行,要么都不执行。 不存在部分完成的事务。例如,如果事务启动并欲更新 100 行,但在系统在完成 20行更新后出现故障,则数据库会回滚这 20 行更新。 -
一致性
事务会将数据库从一个一致状态变为另一个一致状态。 例如, 在从一个储蓄账户借记、 并从一个支票账户贷记的银行事务中,故障一定不能导致数据库仅仅贷记一个账户,这会导致数据不一致。 -
隔离性
一个事务必须在被提交之后,其它事务才能看见其效果。 例如, 正在更新 hr.employees 表的一个用户,不会看到由另一个用户在 employees 表上未提交的更改。因此, 对这些用户来说,这些事务好像是串行执行的。 -
持久性
已提交的事务所做的更改是永久性的。事务完成后, 数据库通过其恢复机制, 确保在事务中所做的更改不会丢失。
使用事务是数据库管理系统有别于文件系统的最重要方式之一。
示例事务: 帐户借贷
为了说明事务的概念,考虑一个银行数据库。
-
减少储蓄账户余额
-
增加支票账户余额
-
在事务日志中记录这笔交易
下图说明了银行事务。第一条语句从储蓄帐户 3209 中减去 500 美元。第二条语句向支票帐户 3208 增加 500 美元。第三条语句在日志表中插入这笔转账记录。最后一个语句提交事务。
图 10-1 银行事务
Description of "Figure 10-1 A Banking Transaction"
事务的结构
数据库事务由一个或多个语句组成。
具体而言,事务包含下列之一:
-
一个或多个数据操作语言 (DML) 语句一起构成的、 对数据库的一个原子更改
-
一个数据定义语言 (DDL) 语句
事务有一个开始点和结束点。
另见:
-
"Overview of SQL Statements"
-
《Oracle Database SQL Language Reference》用于说明SQL语句的类型
事务的开始
事务开始于所遇到的第一个可执行 SQL 语句。
SQL> UPDATE hr.employees SET salary=salary; 107 rows updated.SQL> SELECT XID AS "txn id", XIDUSN AS "undo seg", XIDSLOT AS "slot", 2 XIDSQN AS "seq", STATUS AS "txn status"3 FROM V$TRANSACTION;txn id undo seg slot seq txn status
---------------- ---------- ---------- ---------- ----------------
0600060037000000 6 6 55 ACTIVE
另见:
"Undo Segments"
事务的结束
事务可以在不同的情况下结束。
事务在出现以下操作时结束:
- 用户在没有 SAVEPOINT 子句的语句中发出 COMMIT 或 ROLLBACK。提交意味着用户会显式或隐式地请求事务中所做的更改被持久化。 只有在提交事务之后, 事务所做的更改才是永久性的,并对其他用户可见。
- 用户运行一个 DDL 命令, 如 CREATE、 DROP、 RENAME、 或 ALTER 等。数据库在每个 DDL 语句之前和之后发出一个隐式的 COMMIT 语句。如果当前事务中包含 DML 语句,则 Oracle 数据库首先提交该事务,然后将该 DDL 语句作为一个新的单语句事务来运行并提交。
- 用户从大多数 Oracle 数据库实用程序和工具正常退出, 导致当前事务被隐式提交。当用户断开连接时的提交行为依赖于应用程序,并且是可配置的。
- 客户端进程异常终止,导致数据库使用存储在事务表和撤销段中的元数据来隐式回滚其事务
SQL> UPDATE hr.employees SET salary=salary;
107 rows updated.SQL> SELECT XID, STATUS FROM V$TRANSACTION;XID STATUS
---------------- ----------------
0800090033000000 ACTIVESQL> ROLLBACK;Rollback complete.SQL> SELECT XID FROM V$TRANSACTION;no rows selectedSQL> UPDATE hr.employees SET last_name=last_name;107 rows updated.SQL> SELECT XID, STATUS FROM V$TRANSACTION;XID STATUS
---------------- ----------------
0900050033000000 ACTIVE
另见:
-
"Sample Transaction: Account Debit and Credit"例如以提交结束的事务。
-
《Oracle Database SQL Language Reference》了解 COMMIT
语句级原子性
-
未成功的 SQL 语句只会导致它本身执行的工作丢失。
未成功的语句不会导致丢失当前事务中该语句之前的任何工作。例如,若"Sample Transaction: Account Debit and Credit"中第二个 UPDATE 语句的执行导致错误并被回滚,但由第一个 UPDATE 语句执行的工作是不会被回滚的。第一个 UPDATE 语句可以由用户显式提交或回滚。
-
回滚的效果是,好像该语句从来未运行过。
原子语句的副作用被视为原子语句的一部分, 例如,由语句执行所引发的触发器调用。作为原子语句的一部分所产生的所有工作,要么都成功,要么都失败。
另见:
-
"SQL Parsing"
-
"Locks and Deadlocks"
-
"Overview of Triggers"
系统更改号(SCNs)
系统更改号 (SCN) 是一个由 Oracle 数据库使用的逻辑、 内部的时间戳。
另见:
-
"Overview of Instance Recovery"
-
"Backup and Recovery"
事务控制概述
事务控制即管理 DML 语句所做的更改, 和将 DML 语句分组为事务。
事务控制涉及使用下面的语句,如 "Transaction Control Statements"中所述:
-
COMMIT 语句结束当前事务,并使在事务中执行的所有更改都具有持久性。提交还会清除在事务中的所有保存点,并释放事务锁。
- ROLLBACK 语句将取消当前事务中所做的工作;它导致所有自上次提交或回滚以来的数据更改被丢弃。 ROLLBACK TO SAVEPOINT 语句将撤消自上次保存点以来所做的更改,但不会结束整个事务。
-
SAVEPOINT 语句标识在事务中您可以稍后回滚到的点。
会话表 10-1 说明了事务控制的基本概念
Table 10-1 Transaction Control
T | Session | 解释 |
---|---|---|
t0 |
COMMIT; |
此语句结束会话中的任何现有事务。 |
t1 |
SET TRANSACTION NAME 'sal_update'; |
此语句开始一个事务,并命名为 sal_update。
|
t2 |
UPDATE employeesSET salary = 7000 WHERE last_name = 'Banda'; |
此语句将 Banda 的薪金更新为 7000。 |
t3 |
UPDATE employeesSET salary = 12000 WHERE last_name = 'Greene'; |
此语句创建一个名为 after_banda_sal 的保存点,使该事务中的更改可以回滚到该点。
|
t4 |
UPDATE employeesSET salary = 12000 WHERE last_name = 'Greene'; |
此语句将 Greene 的薪金更新为 12000。 |
t5 |
SAVEPOINT after_greene_sal; |
此语句创建一个名为 after_greene_sal 的保存点,使该事务中的更改可以回滚到该点。
|
t6 |
ROLLBACK TO SAVEPOINTafter_banda_sal; |
此语句将事务回滚至 t3,,撤消在 t4 时对 Greene 薪金的更新。 sal_update 事务并未结束。
|
t7 |
UPDATE employeesSET salary = 11000 WHERE last_name = 'Greene'; |
此语句在事务 sal_update 中将 Greene 的薪金更新为 11000 。
|
t8 |
ROLLBACK; |
此语句回滚事务 sal_update 中的所有更改, 以结束事务。
|
t9 |
SET TRANSACTION NAME 'sal_update2'; |
此语句开始新的会话中的事务,并命名为 sal_update2。
|
t10 |
UPDATE employeesSET salary = 7050 WHERE last_name = 'Banda'; |
此语句将 Banda 的薪金更新为 7050。 |
t11 |
UPDATE employeesSET salary = 10950 WHERE last_name = 'Greene'; |
此语句将 Greene 的薪金更新为 10950。 |
t12 |
COMMIT; |
此语句提交事务 sal_update2 中的所有更改, 以结束事务。提交保证所做的更改被保存在联机重做日志文件中。
|
另见:
《Oracle Database SQL Language Reference》了解事务控制语句
事务名称
事务名称提供了以下优点:
-
有助于监测长时间运行的事务,并解决可疑的分布式事务。
- 您可以在应用程序中查看事务名称及其相应事务 ID。 例如, 数据库管理员可以在监视系统活动时,在 Oracle 企业管理器 (企业管理器) 中查看事务名称。
- 数据库将事务名称写入事务的审计重做记录,因此您可以使用 LogMiner 来搜索在重做日志中的特定事务。
- 可以使用事务名称在 V$TRANSACTION 之类的数据字典视图中查找特定的事务。
另见:
-
"Oracle Enterprise Manager"
-
《Oracle Database Reference》了解 V$TRANSACTION
-
《Oracle Database SQL Language Reference》了解 SET TRANSACTION
活动事务
活动事务即是已开始但尚未提交或回滚的事务。
表 10-2 事务结束前数据的状态
状态 | 描述 | 参见 |
---|---|---|
Oracle 数据库已在SGA中生成撤消数据信息。 |
消数据包含由事务中的 SQL 语句所更改的数据旧值。 |
"Read Consistency in the Read Committed Isolation Level" |
Oracle 数据库已在 SGA 的联机重做日志缓冲区中生成了重做信息。 |
重做日志记录包含数据块和撤消块的更改。 |
"Redo Log Buffer" |
已经对 SGA 中的数据库缓冲区进行了更改。 |
已提交事务所做的数据更改,存储在 SGA 的数据库缓冲区中,但不一定会立即由数据库写入器写入数据文件。 磁盘写入可能会在提交之前或之后发生。
|
"Database Buffer Cache" |
数据更改所影响的行已被锁定。 |
其他用户不能更改受影响的行中的数据,也不能查看未提交的更改。 |
"Summary of Locking Behavior" |
保存点
保存点是事务上下文中的一个由用户声明的中间标记。
回滚到保存点
-
Oracle 数据库将只回滚在该保存点之后运行的语句。
在表 10-1 中, ROLLBACK TO SAVEPOINT 将导致对 Greene 的更新被回滚,但对 Banda 的更新不会被回滚。
- Oracle 数据库保留在 ROLLBACK TO SAVEPOINT 语句中指定的保存点,但随后的所有保存点都将丢失。在表 10-1 中, ROLLBACK TO SAVEPOINT 子句将导致 after_greene_sal 保存点丢失。
- Oracle 数据库释放在指定保存点之后获取的所有表锁和行锁, 但保留在该保存点之前获取的所有数据锁。
事务仍处于活动状态, 并可以继续。
另见:
-
《Oracle Database SQL Language Reference》了解 ROLLBACK 和 SAVEPOINT语句
-
《Oracle Database PL/SQL Language Reference》了解事务处理和控制
排队事务
在下表所示的场景中,会话 1 回滚到在它执行一个 DML 语句之前所创建的保存点。然而会话 2 仍被阻塞,因为它正在等待事务 1 完全完成。
表 10-3 回滚到保存点示例
T | Session 1 | Session 2 | Session 3 | Explanation |
---|---|---|---|---|
t0 |
UPDATE employees SET salary=7000 WHERE last_name= 'Banda'; |
会话 1 开始一个事务。会话将在 Banda 行 (TX) 上置一个独占锁,而在表上置一个子独占表锁(SX) 。
|
||
t1 |
SAVEPOINT after_banda_sal; |
会话 1 创建一个名为 after_banda_sal 的保存点。 |
||
t2 |
UPDATE employees SET salary=12000 WHERE last_name= 'Greene'; |
会话 1 锁定 Greene 行。 |
||
t3 |
UPDATE employees SET salary=14000 WHERE last_name='Greene'; |
会话 2 尝试更新 Greene 行,但未能锁定该行,因为会话 1 已在该行上具有一个锁。 会话 2 中还没有开始任何事务。
|
||
t4 |
ROLLBACKTO SAVEPOINT after_banda_sal; |
会话 1 回滚对 Greene 薪金的更新,并释放了对 Greene 行的锁定。在 t0 时刻获取的表锁仍未释放。
此时会话 2 仍被会话 1 阻塞, 因为会话 2 排在会话 1 中的事务之后,而该事务尚未完成。
|
||
t5 |
UPDATE employees SET salary=11000WHERE last_name='Greene'; |
Greene 行当前并未锁定,因此会话 3 为更新 Greene 行获取了一个该行上的锁。此语句在会话 3 中启动一个事务。
|
||
t6 |
COMMIT; |
会话 1 提交, 结束其事务。 在 Greene 行的更新队列中, 会话 2 现在排在会话 3 中的事务之后。
|
另见:
"Lock Duration"了解 Oracle 数据库何时释放锁的更多信息
事务回滚
事务回滚后, 事务中所做工作的影响就不再存在。对未引用任何保存点的整个事务的回滚, Oracle 数据库执行下列操作:
-
通过使用相应的撤销段, 撤消事务中所有 SQL 语句所做的所有更改
每个活动事务的事务表条目包含一个指向该事务的所有撤消数据(与应用顺序相反)的指针。数据库从撤销段中读取数据, 反转其操作,然后将撤消条目标记为已应用。因此,如果一个事务插入行,则其回滚删除行。如果一个事务更新行,则其回滚反转这个更新。如果一个事务删除一个行,则其回滚重新插入该行。在表 10-1 中,ROLLBACK 反转对 Greene 和 Banda 的薪金更新。 -
释放由事务持有的所有数据锁
-
清除在事务中的所有保存点
在表 10-1 中,ROLLBACK 删除保存点 after_banda_sal。after_greene_sal 保存点被 ROLLBACK TO SAVEPOINT 语句删除。 -
结束事务
在表 10-1 中,ROLLBACK 使数据库处于与刚刚执行了 COMMIT 后相同的状态。
回滚的持续时间与被修改的数据量成正比。
另见:
-
"Undo Segments"
-
《Oracle Database SQL Language Reference》了解有关回滚命令的信息
事务提交
提交结束当前事务,并使事务中执行的所有更改持久化。
在表 10-1 中, 第二个事务从 sal_update2 开始,并以显式 COMMIT 语句结束。在两个 UPDATE 语句中所做的更改现在被持久化了。
当一个事务提交时, 将发生以下操作:
-
为提交生成 SCN。
在关联的回滚表空间的内部事务表中记录已提交的事务。分配相应的唯一事务 SCN, 并将其记录在事务表中。 - 日志写入器 (LGWR) 进程将重做日志缓冲区中的剩余重做日志条目写入到在线重做日志中,并将事务 SCN 写入到在线重做日志中。 这个原子事件是提交事务的本质所在
-
Oracle 数据库释放在行和表上持有的锁。
还在排队等待由未提交事务持有的锁的用户,现在可以继续他们的工作了。 -
Oracle 数据库删除保存点。
在表 10-1 中,在 sal_update 事务中不存在保存点, 所以也没有保存点要清除。 -
Oracle 数据库执行一个提交清理。
如果包含已提交的事务的被修改数据块仍处于 SGA 中,也没有其他会话正在对他们进行修改,则数据库从该块中删除与锁相关的事务信息。理想情况下, COMMIT 会清理该数据块, 以便后续的 SELECT 操作不必再执行此任务。如果某一行不存在ITL条目,那么它就没有被锁定。如果某个特定行的ITL条目存在,那么它可能被锁定,因此会话必须检查undo段标头,以确定是否提交了这个感兴趣的事务。如果感兴趣的事务已提交,则会话将清除该块,从而生成重做。但是,如果 COMMIT 在之前清除了ITL,那么检查和清除就没有必要了。 -
Oracle 数据库将事务标记为完成
事务提交后,用户可以查看所做的更改。
另见:
-
"Serializable Isolation Level"
-
"Locking Mechanisms"
-
"Overview of Background Processes"有关 LGWR 的详细信息
-
《Oracle Database PL/SQL Packages and Types Reference》有关异步提交的详细信息
事务保护概述
事务保护是应用程序可以用来提供事务幂等性的API,事务幂等性是数据库保存有保证的提交结果的能力,该结果指示事务是否提交并完成。Oracle数据库为JDBC thin、OCI、OCCI和ODP.Net提供API。
可恢复错误,是指由外部系统故障引起的,与正在执行的应用程序会话逻辑无关。可恢复错误发生在前台进程、网络、节点、存储和数据库的计划和计划外停机之后。如果中断了客户机应用程序和数据库之间的连接,那么应用程序将收到一条断开连接的错误消息。连接中断时正在运行的事务称为正在运行的事务。
要决定是重演事务,还是将结果(提交或未提交)返回给客户机,应用程序必须确定正在运行的事务的结果。在Oracle Database 12c之前,返回给客户机的提交消息是不持久的。检查事务并不能保证它在检查后不会提交,会允许重复的事务和其他形式的逻辑破坏。例如,用户在线购买一本书时可能刷新web浏览器,并对同一本书收取两次费用。
另见:
-
"Introduction to Transactions"
-
《Oracle Database Development Guide》了解事务保护
-
《Oracle Real Application Clusters Administration and Deployment Guide》了解如何为事务保护配置服务
事务保护的优点
从 Oracle Database 12c 开始,事务保护为应用程序提供了一个工具,用于确定可恢复停机后正在运行的事务的状态。
使用事务保护,应用程序可以确保事务执行不超过一次。例如,如果在线书店应用程序确定先前提交的提交失败,则应用程序可以安全地重演。
事务保护为最多一次执行提供了一个工具,以避免应用程序执行重复的提交。事务保护为每个事务提供一个已知的结果。
事务保护是Oracle数据库的核心功能。应用程序连续性在屏蔽终端用户中断时使用事务保护。如果没有事务保护,应用程序在出错后重试可能会导致提交重复的事务。
另见:
-
"Overview of Application Continuity"了解应用程序连续性,它与事务保护一起工作,帮助开发人员实现高应用程序可用性
-
《Oracle Database Development Guide》要了解事务保护,包括受支持和包含的事务的类型
事务保护如何工作
本节解释丢失提交消息的问题,以及事务保护如何使用逻辑事务id来解决这个问题。
丢失提交信息
在为幂等性设计时,开发人员必须在提交commit语句之后解决通信失败的问题。提交消息不会持久保存在数据库中,因此在失败后无法检索。
下图是客户机应用程序和数据库之间交互的高级表示。
图10-2 丢失提交信息
Description of "Figure 10-2 Lost Commit Message"
在标准提交情况下,数据库提交事务并向客户机返回一条成功消息。在图10-2中,客户机提交一条commit语句,并接收一条消息,说明通信失败。这种类型的故障可能由于多种原因发生,包括数据库实例故障或网络中断。在此场景中,客户端不知道事务的状态。
在通信失败之后,数据库可能仍然在运行提交,并且不知道客户机已断开连接。检查事务状态并不保证活动事务在检查后不会提交。如果客户端因为这个过期的信息重新发送提交,那么数据库可能会重复该事务,从而导致逻辑损坏。
逻辑事务ID
Oracle 数据库通过使用称为逻辑事务ID的全局惟一标识符来解决通信故障。
此ID包含在会话首次连接时分配的逻辑会话号,以及在会话每次提交或回滚时更新的正在运行的提交号。从应用程序的角度来看,逻辑事务ID是在会话上提交的最后一个数据库事务失败时的惟一标识。
对于从客户端提交一个或多个事务的每个往返,数据库存储一个逻辑事务ID。对于提交数据的每个往返,这个ID可以为应用程序和数据库之间的交互提供事务幂等性。
最多一次的协议要求数据库执行以下操作,从而允许访问提交结果:
-
在同意重试的保留期间维护逻辑事务ID
-
在提交时保存逻辑事务ID
在事务运行时,数据库和客户机都持有逻辑事务ID。数据库在身份验证时、从连接池中借用时以及每次往返于执行一个或多个提交操作的客户机驱动程序时,都向客户机提供一个逻辑事务ID。
在应用程序可以确定发生可恢复错误后的最后一个事务的结果之前,应用程序使用 Java、OCI、OCCI 或 ODP.Net API 获取客户端持有的逻辑事务ID。然后,应用程序调用PL/SQL过程DBMS_APP_CONT.GET_LTXID_OUTCOME,使用逻辑事务 ID 来确定最后一次提交的结果:提交(true或false)和用户调用完成(true或false)。
当使用事务保护时,当错误可恢复且会话上的最后一个事务尚未提交时,应用程序可以重演事务。当最后一个事务已提交且用户调用已完成时,应用程序可以继续。应用程序可以使用事务保护将已知的结果返回给客户机,以便客户机可以决定下一步要采取的操作。
另见:
-
《Oracle Database Development Guide》了解逻辑事务ID
-
《Oracle Database PL/SQL Packages and Types Reference》了解
DBMS_APP_CONT.GET_LTXID_OUTCOME
procedure
事务保护:示例
在此场景中,由于可恢复错误,提交消息丢失。
事务保护程序使用逻辑事务 ID 来保留 COMMIT 语句的结果,确保事务有已知的结果。
图 10-3 检查逻辑事务状态
Description of "Figure 10-3 Check of Logical Transaction Status"
在图10-3中,数据库通知应用程序事务是否已提交以及最后一次用户调用是否完成。然后,应用程序可以将结果返回给最终用户。这些可能性是:
-
如果事务已提交,用户调用完成,则应用程序可以将结果返回给最终用户并继续。
-
如果事务已提交但用户调用未完成,则应用程序可以向最终用户返回带有警告的结果。示例包括丢失的绑定或已处理的行数。一些应用程序依赖于额外的信息,而另一些则不依赖。
-
如果用户调用未提交,则应用程序可以将此信息返回给最终用户,或安全地重演。协议得到了保证。当提交状态返回false时,最后一个提交将被阻止提交。
另见:
《Oracle Database Development Guide》学习如何使用事务保护
应用程序连续性概述
应用程序连续性试图通过在非计划和计划中断后重演不完整的应用程序请求来掩盖应用程序的中断。在这种情况下,请求是来自应用程序的工作单元。
通常,请求对应于在单个数据库连接上的DML语句和单个web请求的其他数据库调用。一般而言,请求由连接池中数据库连接的签出和签入之间的调用来划分。
应用程序连续性的优点
开发人员面临的一个基本问题是如何向最终用户隐藏丢失的数据库会话。
应用程序连续性试图通过恢复数据库会话(在任何组件中断数据库和客户机之间的对话时)来解决会话丢失的问题。恢复后的数据库会话包含所有状态、游标、变量以及存在的最新事务。
应用程序连续性用例
在典型的情况下,客户机向数据库提交了一个请求,数据库已经建立了事务性和非事务性状态。
客户机上的状态保持为当前状态,可能包含输入的数据、返回的数据、缓存的数据和变量。但是,应用程序需要的操作数据库会话的状态丢失了。
如果客户端请求已启动一个或多个事务,则应用程序面临以下可能性:
-
如果已发出提交,则返回给客户机的提交消息不是持久的。客户端不知道请求是否已提交,以及在非事务性处理状态中请求到达何处。
-
如果没有发出提交,或者发出了提交但没有执行,那么将回滚正在运行的事务,并且必须使用处于正确状态的会话重演。
如果重新执行成功,则针对计划内和计划外停机的数据库用户服务不会中断。如果数据库检测到应用程序看到数据中的更改并可能对其进行操作,则拒绝重新执行。当超过允许启动重新执行的时间、应用程序使用受限调用或应用程序使用disableReplay方法显式禁用重新执行时,不尝试重新执行。
另见:
《Oracle Real Application Clusters Administration and Deployment Guide》了解更多关于数据库会话的应用程序连续性的工作原理
计划维护的应用连续性
计划中断的应用程序连续性使应用程序能够继续对数据库会话进行操作,这些会话可以可靠地用尽或迁移。
定期维护不需要中断应用程序的工作。应用程序连续性使活动工作时间从当前位置排到当前不受维护影响的新位置。在耗尽间隔结束时,会话可能仍然保留在计划维护的数据库实例上。与强制断开这些会话不同,应用程序连续性可以将这些会话故障转移到幸存的站点,并重演任何正在运行的事务。
启用了应用程序连续性后,数据库可以做以下工作:
-
在维护期间,对传入或现有工作都不报告错误
-
将活动数据库会话重定向到其他功能服务
-
根据需要,在维护期间和之后重新平衡数据库会话
使用SRVCTL实用程序、全局数据服务控制实用程序(GDSCTL)和Oracle Data Guard Broker的drain_timeout和stop_option服务属性控制计划维护期间的排放行为。DBMS_SERVICE包提供底层基础架构。
另见:
-
《Oracle Real Application Clusters Administration and Deployment Guide》学习更多的应用程序连续性
-
《Oracle Database PL/SQL Packages and Types Reference》了解更多关于DBMS_SERVICE的信息
-
《Oracle Real Application Clusters Administration and Deployment Guide》对于SRVCTL命令引用
-
《Oracle Database Global Data Services Concepts and Administration Guide》对于GDSCTL命令引用
应用连续性架构
应用程序连续性的关键组件是运行时、重连接和重演。
各阶段如下:
-
正常运行时
在这个阶段,应用程序连续性执行以下任务:
-
标识数据库请求
-
决定是否可以重演本地和数据库调用
-
构建代理对象,以便在必要时启用重演和管理队列
-
保存原始调用并验证这些调用,直到禁用数据库请求或重演结束
-
-
重新连接
此阶段由可恢复错误触发。应用程序连续性执行以下任务:
-
确保对数据库请求启用重演
-
管理超时
-
获取到数据库的新连接,然后验证这是一个有效的数据库目标
-
使用事务保护来确定最后提交的事务是否成功(提交的事务不重新提交)
-
-
重演
应用程序连续性执行以下任务:
-
重演队列中保存的调用
-
如果重演过程中出现用户可见的结果更改,则禁用重演
-
不允许提交,但允许最后一次收回(遇到错误)提交
-
在成功重新执行之后,请求将从失败点继续。
另见:
-
"Overview of Transaction Guard"
-
《Oracle Real Application Clusters Administration and Deployment Guide》了解有关应用程序连续性的更多信息
-
《Oracle Database JDBC Developer's Guide》和《Oracle Database JDBC Java API Reference》要了解更多关于JDBC和应用程序连续性的知识
自治事务概述
自治事务具有以下特征:
- 自治事务不会看见在主事务中所做的未提交更改, 也不与主事务共享锁或资源。
- 自治事务中的更改在其提交后对其它事务是可见的。因此, 用户可以立刻访问更新的信息,而不必等到主事务提交。
- 自治事务可以启动其他自治事务。 没有关于自治事务能调用多少级别的任何限制,这只受限于可用的资源。
下图显示了控制如何从主程序 (MT) 流向一个自治例程,又如何返回。主程序是 proc1 ,自治例程是 proc2。自治例程在控制返回主例程之前可以提交多个事务 (AT1 和 AT2)。
图 10-4 事务控制流
Description of "Figure 10-4 Transaction Control Flow"
另见:
《Oracle Database Development Guide》和《Oracle Database PL/SQL Language Reference》学习如何使用自治事务
分布式事务概述
另见:
《Oracle Database Administrator’s Guide》了解如何管理分布式事务
两阶段提交
另见:
-
《Oracle Database Administrator’s Guide》了解两阶段提交机制
-
《Oracle Database SQL Language Reference》
可疑事务
可疑分布式事务,发生在两阶段提交被任何类型的系统或网络故障中断时。
如果数据库必须恢复到过去的某个时间, 则数据库恢复工具使得在其它站点的数据库管理员能将其数据库返回到某个过去的时间点。此操作可确保全局数据库保持一致。
另见:
-
"Recoverer Process (RECO)"
-
《Oracle Database Administrator’s Guide》了解如何管理可疑事务