Udostępnij za pośrednictwem


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

  1. Wywołaj CDatabase funkcję składową BeginTrans obiektu.

  2. Jeśli pobieranie wierszy zbiorczych nie zostało zaimplementowane, wywołaj AddNew/Updatefunkcje składowe , Edit/Updatei Delete 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.

  3. 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 jego Rollback 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_dbStudentRegzmienna 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