事务:在记录集中执行事务 (ODBC)
本主题介绍如何在记录集中执行事务。
注意
仅支持一个级别的事务;无法嵌套事务。
在记录集中执行事务
调用
CDatabase
对象的BeginTrans
成员函数。如果尚未实现批量提取行,请根据需要多次调用同一数据库的一个或多个记录集对象的
AddNew/Update
、Edit/Update
和Delete
成员函数。 有关详细信息,请参阅记录集:添加、更新和删除记录 (ODBC)。 如果已实现批量提取行,则必须写入自己的函数来更新数据源。最后,调用
CDatabase
对象的CommitTrans
成员函数。 如果其中一个更新发生错误或你决定取消更改,请调用其Rollback
成员函数。
以下示例使用两个记录集从学校注册数据库中删除学生的注册,从而将该学生从其注册的所有班级中删除。 因为两个记录集中的 Delete
调用必须成功,所以需要一个事务。 该示例假定存在 m_dbStudentReg
、已连接到数据源的 CDatabase
类型的成员变量,以及记录集类 CEnrollmentSet
和 CStudentSet
。 strStudentID
变量包含从用户处获取的值。
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
而不调用 CommitTrans
或 Rollback
会出错。