事务处理

“事务”界定了通过连接执行的一系列数据访问操作的开始和结束。 Connection 对象还可用于创建和管理事务,具体取决于数据源的事务功能。 例如,使用 Microsoft OLE DB Provider for SQL Server 访问 Microsoft SQL Server上的数据库,可以为所执行的命令创建多个嵌套事务。

ADO 可确保事务中的操作导致的对数据源的更改一起成功发生或根本全都不发生。

如果取消该事务,或者其中一项操作失败,结果将如同事务中的任何操作都没有发生一样。 数据源将保持事务开始前的状态。

ADO 提供了以下用于控制事务的方法:BeginTrans、CommitTrans 和 RollbackTrans。 当你希望将对源数据进行的一系列更改作为一个单元保存或取消时,可以将这些方法与 Connection 对象一起使用。 例如,若要在帐户之间转移资金,需要从一个帐户中减去一个金额,并将同一金额添加到另一个帐户。 如果任一更新失败,帐户将不再平衡。 在打开的事务中做出这些更改可确保所有更改都全部完成或任何更改都不发生。

注意

并非所有提供程序都支持事务。 验证提供程序定义的属性“Transaction DDL”是否出现在 Connection 对象的 Properties 集合中,这表明该提供程序支持事务。 如果提供程序不支持事务,则调用上述任一方法将会返回错误。

在你调用 BeginTrans 方法后,提供程序将不再即时提交你所做的更改,直到你调用了 CommitTrans 或 RollbackTrans 以结束事务。

调用 CommitTrans 方法会保存在连接上的打开事务中所做的更改并结束事务。 调用 RollbackTrans 方法会撤消在打开的事务中所做的更改并结束事务。 在没有打开的事务时调用任一方法都会产生错误。

调用 CommitTrans 或 RollbackTrans 方法可能会自动启动新事务,具体取决于 Connection 对象的 Attributes 属性。 如果 Attributes 属性设置为 adXactCommitRetaining,提供程序会在 CommitTrans 调用后自动启动一个新事务。 如果 Attributes 属性设置为 adXactAbortRetaining,提供程序会在 RollbackTrans 调用后自动启动一个新事务。

事务隔离级别

使用 IsolationLevel 属性可在 Connection 对象上设置事务的隔离级别。 在你下次调用 BeginTrans 方法之前,该设置不会生效。 如果你请求的隔离级别不可用,提供程序可能会返回下一个更高的隔离级别。 有关有效值的详细信息,请参阅“ADO 程序员参考”中的 IsolationLevel 属性。

嵌套事务

对于支持嵌套事务的提供程序,在打开的事务中调用 BeginTrans 方法会启动一个新的嵌套事务。 返回值表示嵌套级别:返回值“1”表示你打开了一个顶级事务(即该事务没有嵌套在另一个事务中),“2”表示你打开了一个二级事务(一个嵌套在顶级事务中的事务),等等。 调用 CommitTrans 或 RollbackTrans 仅影响最近打开的事务;必须先关闭或回滚当前事务,然后才能解析任何更高级别的事务。