Transakcja: wykonywanie transakcji w zestawie rekordów (ODBC)
W tym temacie opisano sposób wykonywania transakcji w zestawie rekordów.
Uwaga
Obsługiwany jest tylko jeden poziom transakcji; nie można zagnieżdżać transakcji.
Aby wykonać transakcję w zestawie rekordów
Wywołaj
CDatabase
funkcję składowąBeginTrans
obiektu.Jeśli pobieranie wierszy zbiorczych nie zostało zaimplementowane, wywołaj
AddNew/Update
funkcje składowe ,Edit/Update
iDelete
co najmniej jednego obiektu zestawu rekordów tej samej bazy danych tyle razy, ile jest to konieczne. Aby uzyskać więcej informacji, zobacz Zestaw rekordów: dodawanie, aktualizowanie i usuwanie rekordów (ODBC). Jeśli zaimplementowano pobieranie wierszy zbiorczych, musisz napisać własne funkcje, aby zaktualizować źródło danych.Na koniec wywołaj
CDatabase
funkcję składowąCommitTrans
obiektu. Jeśli wystąpi błąd w jednej z aktualizacji lub zdecydujesz się anulować zmiany, wywołaj jegoRollback
funkcję składową.
W poniższym przykładzie użyto dwóch zestawów rekordów, aby usunąć rejestrację ucznia z bazy danych rejestracji szkoły, usuwając ucznia ze wszystkich klas, w których student jest zarejestrowany. Ponieważ wywołania Delete
obu zestawów rekordów muszą zakończyć się powodzeniem, wymagana jest transakcja. W tym przykładzie przyjęto założenie, że istnieje m_dbStudentReg
zmienna składowa typu CDatabase
, która jest już połączona ze źródłem danych, oraz klas zestawów rekordów CEnrollmentSet
i CStudentSet
. Zmienna strStudentID
zawiera wartość uzyskaną od użytkownika.
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;
}
Uwaga
Wywołanie BeginTrans
ponownie bez wywoływania CommitTrans
lub Rollback
jest błędem.
Zobacz też
Transakcja (ODBC)
Transakcja: jak transakcje wpływają na aktualizacje (ODBC)
Klasa CDatabase
Klasa CRecordset