下面的“事务方法”管理在会话处理中的事务,会话由 object 所在处表示:
- BeginTrans 开始一个新的事务。
- CommitTrans 结束当前事务并保存所作的修改。
- RollbackTrans 结束当前事务并将在 rdoEnvironment 对象中的数据库还原到该当前事务开始时的状态。
可以对 rdoConnection 对象使用事务方法-但是在这种情况下,事务的范围只限于在 rdoConnection 下建立的 rdoResultset 和 rdoQuery 对象中。
语法
object.BeginTrans | CommitTrans | RollbackTrans
object 所在处代表一个对象表达式,其值为“应用于”列表中的一个对象。
说明
当要将在会话中对数据库所作的一系列改变作为一个逻辑单元时,可以对 rdoEnvironment 或 rdoConnection 对象使用事务方法。也就是,一个操作集合既以一个集合为单位完成,也以一个集合为单位回滚。这样,如果集合的任何操作失败,则整个事务也失败。事务还允许对数据库作临时改变- 该改变可用 RollbackTrans 方法取消。
一般,ODBC 驱动程序以下列两种模式中的一种工作:
- 自动提交模式:当没有显式地使用 BeginTrans 方法启动一个事务,每一个被执行的操作在完成时都立即提交给数据库。
- 手工提交模式:当显式地使用 BeginTrans 方法启动一个事务时,或使用 ODBC SQLSetStmtOption 函数禁止 SQL_AUTO_COMMIT 模式时,或发送一个 SQL 语句启动一个事务 (BEGIN TRANS) 时,所有操作都是事务中的一部分,并且不作修改地提交给数据库,直到使用 CommitTrans 方法为止。如果执行 CommitTrans,或使用 RollbackTrans 方法之前连接失败,就取消这个操作-回滚。
注意 当使用远程服务器时,如果该服务器象 Microsoft SQL Server 那样支持分布式的事务协调程序 (DTC),就可以初始化和控制跨越多个服务器的事务。也就是,如果在调用一个远程过程的远程服务器上调用一个过程,则 DTC 可以保证该操作被包括在初始化的事务中。详细信息,
一般来说,当必须更新两个或多个表中的行,并确保在所有的表中所作的改变或者都被完成(提交)、或者一点也不变(回滚)时,使用事务维护数据的完整性。例如,当将钱从一个帐户转到另一个帐户时,需要从一个帐户上减去一个数并将其加到另一个帐户上。如果其中有一个修改失败,帐户就不会平衡。在修改第一行之前,先使用 BeginTrans 方法,然后,只要再有修改失败,就可以使用 RollbackTrans 方法撤消所有的修改。在成功地修改了最后一行之后,就使用 CommitTrans 方法。
注意 在一个 rdoEnvironment 对象内,对于该 rdoEnvironment,事务总是全局的,并不只限于一个数据库,或一个结果集。如果在一个 rdoEnvironment 事务内、在多个数据库或结果集上完成操作,则 RollbackTrans 方法还原所有的在那些数据库和结果集上的操作。
一旦使用 CommitTrans,就不能取消在该事务中所作的改变,不过若该事务嵌套在另一个要回滚的事务中除外。除非使用动作查询直接执行 SQL 事务管理语句,否则事务不能嵌套。如果想模拟覆盖的、无嵌套的范围的事务,可以建立另外的 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 不支持事务,则这些方法将被忽略并且不产生错误。