Поделиться через


Транзакции: выполнение транзакции в наборе записей (ODBC)

В этом разделе объясняется, как выполнять транзакцию в наборе записей.

Примечание.

Поддерживается только один уровень транзакций; Не удается вложить транзакции.

Выполнение транзакции в наборе записей

  1. CDatabase Вызовите функцию-член объектаBeginTrans.

  2. Если вы не реализовали массовое получение строк, вызовите AddNew/Updateфункции и Edit/UpdateDelete члены одного или нескольких объектов набора записей одной базы данных столько раз, сколько необходимо. Дополнительные сведения см. в разделе Recordset: Добавление, обновление и удаление записей (ODBC). Если вы реализовали массовое получение строк, необходимо написать собственные функции для обновления источника данных.

  3. Наконец, вызовите CDatabase функцию-член объекта CommitTrans . Если ошибка возникает в одном из обновлений или вы решили отменить изменения, вызовите ее Rollback функцию-член.

В следующем примере используются два набора записей для удаления регистрации учащегося из базы данных регистрации учебного заведения, удаление учащегося из всех классов, в которых зарегистрирован учащийся. Delete Так как вызовы в обоих наборах записей должны быть успешными, требуется транзакция. В примере предполагается существование m_dbStudentReg, переменная члена типа CDatabase , уже подключенная к источнику данных, а также классы CEnrollmentSet наборов записей и CStudentSet. Переменная strStudentID содержит значение, полученное от пользователя.

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;

}

Примечание.

Повторный вызов без вызова BeginTransCommitTrans или Rollback ошибка.

См. также

Транзакция (ODBC)
Транзакция. Влияние транзакций на обновления (ODBC)
Класс CDatabase
Класс CRecordset