Transakcja: wykonywanie transakcji w zestawie rekordów (ODBC)
W tym temacie opisano sposób przeprowadzenia transakcji w zestawie rekordów.
[!UWAGA]
Obsługiwany jest tylko jeden poziom transakcji; Nie można zagnieżdżać transakcji.
Do wykonania transakcji w zestawie rekordów
Wywołanie CDatabase obiektu BeginTrans funkcji składowej.
Jeśli nie zaimplementowano pobieranie wiersza zbiorczego, call AddNew/Update, Edycja/Update, i usunąć funkcji elementów członkowskich z jednego lub kilku obiektów recordset tej samej bazy danych dowolną liczbę razy.Aby uzyskać więcej informacji, zobacz zestaw rekordów: dodawania, aktualizowania i usuwania rekordów (ODBC).Jeśli zaimplementowano wiersza zbiorczego pobierania, należy napisać własne funkcje do aktualizacji źródła danych.
Wreszcie, wywołanie CDatabase obiektu CommitTrans funkcji składowej.Jeśli wystąpi błąd w jedną z aktualizacji lub zdecydować anulować zmiany, wywołanie jego Rollback funkcji składowej.
W poniższym przykładzie użyto dwóch zestawów rekordów do usunięcia z bazy danych rejestracji szkoły, usuwanie student z wszystkich klas, w których trwa rejestracja student rejestracji studenta.Ponieważ usunąć wywołań w obu zestawów rekordów musi zakończyć się sukcesem, wymagana jest transakcja.W przykładzie zakłada istnienie m_dbStudentReg, zmienna członka typu CDatabase już połączony ze źródłem danych, a także klasy recordset CEnrollmentSet i CStudentSet.strStudentID Zmienna zawiera wartość otrzymanych 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 stawiania CommitTrans lub Rollback jest błędem.