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

  1. Wywołanie CDatabase obiektu BeginTrans funkcji składowej.

  2. 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.

  3. 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.

Zobacz też

Informacje

Klasa CDatabase

Klasa CRecordset

Koncepcje

Transakcja (ODBC)

Transakcja: jak transakcje wpływają na aktualizacje (ODBC)