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ździć transakcji.
Do wykonania transakcji w zestawie rekordów
Wywołanie CDatabase obiektu BeginTrans funkcji składowej.
Jeśli nie wprowadziły pobieranie wiersza luzem, wywołanie AddNew/Aktualizuj, Edytuj/Aktualizuj, i usunąć funkcji elementów członkowskich obiektów recordset, tej samej bazy danych jako liczbę razy.Aby uzyskać więcej informacji, zobacz zestaw rekordów: Dodawanie, aktualizowanie i usuwanie rekordów (ODBC).Jeśli zaimplementowano wiersz luzem, pobieranie, należy napisać własne funkcje aktualizacji źródła danych.
Wreszcie, call CDatabase obiektu CommitTrans funkcji składowej.Jeśli wystąpi błąd w jednej aktualizacji lub zdecydować anulować zmiany, należy wywołać jej wycofywania funkcji składowej.
Poniższy przykład wykorzystuje dwa zestawy rekordów usunąć rejestrowania studenta z bazy danych rejestracji szkoły, usuwanie student z wszystkich klas, w których trwa rejestracja student.Ponieważ usunąć wywołania w oba zestawy musi zakończyć się sukcesem, wymagana jest transakcja.W przykładzie zakłada się istnienie m_dbStudentReg, zmienną typu CDatabase już podłączony do źródła danych i klas rekordów 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 wywołania CommitTrans lub wycofywania , występuje błąd.