事务:在记录集中执行事务 (ODBC)

本主题介绍如何在记录集中执行事务。

注意

仅支持一个级别的事务;无法嵌套事务。

在记录集中执行事务

  1. 调用 CDatabase 对象的 BeginTrans 成员函数。

  2. 如果尚未实现批量提取行,请根据需要多次调用同一数据库的一个或多个记录集对象的 AddNew/UpdateEdit/UpdateDelete 成员函数。 有关详细信息,请参阅记录集:添加、更新和删除记录 (ODBC)。 如果已实现批量提取行,则必须写入自己的函数来更新数据源。

  3. 最后,调用 CDatabase 对象的 CommitTrans 成员函数。 如果其中一个更新发生错误或你决定取消更改,请调用其 Rollback 成员函数。

以下示例使用两个记录集从学校注册数据库中删除学生的注册,从而将该学生从其注册的所有班级中删除。 因为两个记录集中的 Delete 调用必须成功,所以需要一个事务。 该示例假定存在 m_dbStudentReg、已连接到数据源的 CDatabase 类型的成员变量,以及记录集类 CEnrollmentSetCStudentSetstrStudentID 变量包含从用户处获取的值。

BOOL CEnrollDoc::RemoveStudent( CString strStudentID )
{
    // remove student from all the classes
    // the student is enrolled in

    if ( !m_dbStudentReg.BeginTrans( ) )
        return FALSE;

    CEnrollmentSet rsEnrollmentSet(&m_dbStudentReg);
    rsEnrollmentSet.m_strFilter = "StudentID = " + strStudentID;

    if ( !rsEnrollmentSet.Open(CRecordset::dynaset) )
        return FALSE;

    CStudentSet rsStudentSet(&m_dbStudentReg);
    rsStudentSet.m_strFilter = "StudentID = " + strStudentID;

    if ( !rsStudentSet.Open(CRecordset::dynaset) )
        return FALSE;

    TRY
    {
        while ( !rsEnrollmentSet.IsEOF( ) )
        {
            rsEnrollmentSet.Delete( );
            rsEnrollmentSet.MoveNext( );
        }

        // delete the student record
        rsStudentSet.Delete( );

        m_dbStudentReg.CommitTrans( );
    }

    CATCH_ALL(e)
    {
        m_dbStudentReg.Rollback( );
        return FALSE;
    }
    END_CATCH_ALL

    rsEnrollmentSet.Close( );
    rsStudentSet.Close( );

    return TRUE;

}

注意

再次调用 BeginTrans 而不调用 CommitTransRollback 会出错。

另请参阅

事务 (ODBC)
事务:事务如何影响更新 (ODBC)
CDatabase 类
CRecordset 类