# Re: BeginTrans,CommitTrans是什么意思?

Posted by 矿泉水 on September 12, 1999 at 17:35:43:

In Reply to: BeginTrans,CommitTrans是什么意思? posted by kkcheung on September 11, 1999 at 17:46:29:

: 我常甩在程式中见到使用BeginTrans,CommitTrans.
: 它们有什么作用及意思,要一齐使用的吗?

::
CommitTrans 事件

该事件是在 CommitTrans 方法完成之后发生。

语法

Private Sub object.CommitTrans( )

object 代表一个物件运算式，其值为「适用于」清单中的某个物件。

请注意

该事件是在 CommitTrans 方法执行后引发。开发者对该事件的回应可使其它的一些处理与该交易同步。

RollbackTrans 方法 (远端资料)

下面的交易方法是用来管理在对话过程中正在处理的交易 (Transaction)。

BeginTrans 开始一个新的交易。

CommitTrans 结束目前交易并储存所作的修改。

RollbackTrans 结束目前交易，并回复 rdoEnvironment 物件中的资料库到该目前交易开始时的状态。
您可以对 rdoConnection 物件使用交易方法-但是在这种情况下，交易的范围只限于在 rdoConnection 下产生的 rdoResultset 和 rdoQuery 物件中。

语法

object.BeginTrans | CommitTrans | RollbackTrans

object 代表一个物件运算式，其值为「适用于」清单中的一个物件。

请注意

当您要在对话 (Session) 中对资料库所作的一系列改变当作是一个逻辑单位来处理时，您可以对 rdoEnvironment 或 rdoConnection 物件使用交易方法。也就是说，以动作集合为单位完成交易，或以一个集合为单位复原 (Roll Back) 。如此一来，如果集合中的任何动作失败，则整个交易也失败。交易还允许对资料库作暂时改变 - 该改变可用 RollbackTrans 方法取消。

一般说来，ODBC 驱动程式以下面两种模式工作：

自动交易认可模式 (Auto-commit Mode)：当没有使用 BeginTrans 方法启动一个交易，每一个被执行的动作在完成时都立即认可在资料库中的交易。

手动交易认可模式 (Manual-commit Mode)：当使用 BeginTrans 方法启动交易时，或使用 ODBC SQLSetStmtOption 函数关闭 SQL_AUTO_COMMIT 模式时，或传送一个 SQL 陈述式来启动交易 (BEGIN TRANS) 时，所有的动作都是交易中的一部份，并且在没有认可任何资料库的交易，直到使用 CommitTrans 方法为止。如果执行 CommitTrans，或使用 RollbackTrans 方法之前连接失败，就取消这个动作 - 复原 (Roll Back)。
附注 当使用远端伺服器时，如果该伺服器像 Microsoft SQL Server 支援分散式的交易协调程式 (DTC)，则您就可以初始化和控制跨越多个伺服器的交易。也就是说，如果您叫用一个远端伺服器上的远端程序呼叫 (Remote Procedure Call)，则 DTC 可以保证该动作被包含在初始化的交易中。

一般来说，当您必须更新两个或多个资料表中的资料列时，并确保在所有的资料表中所作的改变都被完成 (交易认可)、或者不变 (复原) 时，您可以使用交易来维护资料的完整性。例如，当您将钱从一个帐户移至另一个帐户时，需要从帐户上减去一个数并加到另一个帐户上。如果其中有一个更新失败，帐户就不会平衡。在更新第一笔资料列前，先使用 BeginTrans 方法，然后，只要有任何更新失败，就可以使用 RollbackTrans 方法撤销所有的更新。在您成功地更新最后一笔资料列之后，就可使用 CommitTrans 方法。

注意 在一个 rdoEnvironment 物件内，对于该 rdoEnvironment 而言，交易总是总体的，它并不只局限于一个资料库，或一个结果集(Result Set)。如果在一个 rdoEnvironment 交易中、对多个资料库或结果集执行动作，则 RollbackTrans 方法会复原所有在资料库和结果集何上的动作。

一旦您使用 CommitTrans，就无法取消在该交易中所作的改变，除非该交易是另一个自行复原的交易的巢状部份。除了使用动作查询 (Action Query) 直接执行 SQL 交易管理陈述式外，则交易无法以巢状方式处理。如果想要平行处理重覆的、无巢状范围 (Non-Nested scope) 的交易，您可以另外产生包含平行交易 (Current transaction) 的 rdoEnvironment 物件。

附注 您可以使用包含交易陈述式的 SQL 动作查询。例如，对于 Microsoft SQL Server，可以使用 SQL 陈述式，如，BEGIN TRANSACTION, COMMIT TRANSACTION 或 ROLLBACK TRANSACTION。这项技术支援 ODBC 驱动程式所不支援的巢状交易。

如果您不储存或者复原任何暂停执行的交易，就关闭 rdoEnvironment 物件，则交易会自动复原。

如果不先使用 BeginTrans 方法就使用了 CommitTrans 或 RollbackTrans 方法，不会产生任何错误。

有些资料库不支援交易，在这些情况下，rdoConnection 物件或 rdoResultset 物件的 Transactions 属性为 False。为了保证资料库能支援交易，在使用 BeginTrans 方法之前，先检查 rdoConnection 物件的 Transactions 属性的值。如果对多个资料库使用 rdoResultset 物件，则先检查该 rdoResultset 物件的 Transactions 属性。如果 rdoConnection 或 rdoResultset 不支援交易，则这些方法将被忽略并且不会产生错误。

Follow Ups: