Транзакции: выполнение транзакции в наборе записей (ODBC)
В этом разделе объясняется, как выполнять транзакцию в наборе записей.
Примечание.
Поддерживается только один уровень транзакций; Не удается вложить транзакции.
Выполнение транзакции в наборе записей
CDatabase
Вызовите функцию-член объектаBeginTrans
.Если вы не реализовали массовое получение строк, вызовите
AddNew/Update
функции иEdit/Update
Delete
члены одного или нескольких объектов набора записей одной базы данных столько раз, сколько необходимо. Дополнительные сведения см. в разделе Recordset: Добавление, обновление и удаление записей (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
ошибка.
См. также
Транзакция (ODBC)
Транзакция. Влияние транзакций на обновления (ODBC)
Класс CDatabase
Класс CRecordset