事务 (ODBC)

本主题适用于 MFC ODBC 类。

事务是将一系列 数据源更新分组或分批的方法,以便在回滚事务时同时提交所有事务或者不提交任何事务。 如果不使用事务,数据源的更改将自动提交而不是按需提交。

备注

不是所有的 ODBC 数据库驱动程序都支持事务。调用 CDatabaseCRecordset 对象的 CanTransact 成员函数,确定您的驱动程序是否支持给定数据库的事务。请注意,CanTransact 不通知您数据源是否提供完全事务支持。在 CommitTransRollback 之后还必须调用 CDatabase::GetCursorCommitBehaviorCDatabase::GetCursorRollbackBehavior,以检查事务在打开的 CRecordset 对象上的效果。

调用 Update 时,调用 CRecordset 对象的 AddNewEdit 成员函数会立即影响数据源。 Delete 调用也立即生效。 相比之下,可以使用由多次 AddNewEditUpdateDelete 调用组成的事务,这些调用被执行,但直到显式调用 CommitTrans 时才提交。 通过建立事务,可以执行一系列这样的调用,同时保留使调用回滚的能力。 如果关键资源不可用或一些其他情况妨碍了整个事务的完成,可以回滚事务而不是提交事务。 在回滚事务时,属于事务的所有更改都不影响数据源。

备注

目前,如果已实现批量取行,则 CRecordset 类不支持数据源更新。这意味着不能调用 AddNewEditDeleteUpdate。但是,您可以编写自己的函数来执行更新,然后在给定的事务内调用那些函数。有关批量取行的更多信息,请参见记录集:批量获取记录 (ODBC)

备注

除了影响记录集外,事务还影响 SQL 语句,这些语句只要您使用与 CDatabase 对象关联的 ODBC HDBC 或使用基于该 HDBC 的 ODBC HSTMT,就会直接执行。

当有多个记录必须同时更新时,事务特别有用。 在这种情况下,您需要避免仅完成了一半的事务,例如当最后的更新完成前引发异常时所发生的事务。 将这些更新组成事务可以恢复(回滚)更改,使记录恢复到事务前的状态。 例如,如果银行将钱从帐户 A 转到帐户 B,从帐户 A 的提款和向帐户 B 的存款都必须正确地成功处理,否则整个事务必将失败。

在数据库类中,通过 CDatabase 对象执行事务。 CDatabase 对象表示到数据源的连接,与该 CDatabase 对象关联的一个或多个记录集通过记录集成员函数在数据库表上操作。

备注

仅支持一个级别的事务。事务不能嵌套,也不能跨多个数据库对象。

下列主题提供了有关如何执行事务的更多信息:

请参见

概念

开放式数据库连接 (ODBC)