事务 (ODBC)
本主题适用于 MFC ODBC 类。
事务是一种对数据源的一系列更新进行分组或批处理的方法,以便同时提交所有更新,或者不提交任何更新(如果回滚事务)。 如果不使用事务,则会自动提交对数据源的更改,而不是按需提交。
注意
并非所有 ODBC 数据库驱动程序都支持事务。 调用 CDatabase 或 CRecordset 对象的 CanTransact
成员函数来确定驱动程序是否支持给定数据库的事务。 请注意,CanTransact
不告知数据源是否提供完整的事务支持。 还必须在 CommitTrans
和 Rollback
之后调用 CDatabase::GetCursorCommitBehavior
和 CDatabase::GetCursorRollbackBehavior
,以检查事务对开放 CRecordset
对象的影响。
当调用 Update
时,对 CRecordset
对象的 AddNew
和 Edit
成员函数的调用会立即影响数据源。 Delete
调用也会立即生效。 相反,可以使用由对 AddNew
、Edit
、Update
和 Delete
的多个调用组成的事务,这些调用在你显式调用 CommitTrans
之前执行但不会提交。 通过建立事务,可以执行一系列此类调用,同时保留回滚这些调用的能力。 如果关键资源不可用或某些其他条件阻止整个事务完成,则可以回滚事务,而不是提交该事务。 在这种情况下,属于事务的任何更改都不会影响数据源。
注意
目前,如果已实现批量提取行,则类 CRecordset
不支持更新数据源。 这意味着无法调用 AddNew
、Edit
、Delete
或 Update
。 但是,可以编写自己的函数来执行更新,然后在给定事务中调用这些函数。 有关批量行提取的详细信息,请参阅记录集:批量提取记录 (ODBC)。
注意
除了影响记录集外,只要使用与 CDatabase
对象关联的 ODBC HDBC 或基于该 HDBC 的 ODBC HSTMT,事务还会影响直接执行的 SQL 语句。
如果有多个必须同时更新的记录,则事务特别有用。 在这种情况下,需要避免半完成的事务,例如在进行最后一次更新之前引发异常时可能发生的情况。 通过将此类更新分组为事务,可从更改中恢复(回滚)并将记录返回到事务前状态。 例如,如果银行将资金从帐户 A 转移到帐户 B,则从 A 取款和存入 B 的操作都必须成功才可正确处理款项,否则整个事务必须失败。
在数据库类中,通过 CDatabase
对象执行事务。 CDatabase
对象表示与数据源的连接,与该 CDatabase
对象关联的一个或多个记录集通过记录集成员函数对数据库的表进行操作。
注意
仅支持一个级别的事务。 不能嵌套事务,也不能将一个事务跨越多个数据库对象。
以下主题提供有关如何执行事务的详细信息: