Transacción: Realizar una transacción en un conjunto de registros (ODBC)

En este tema se explica cómo realizar una transacción en un conjunto de registros.

Nota:

Solo se admite un nivel de transacciones; no se pueden anidar transacciones.

Para realizar una transacción en un conjunto de registros

  1. Llame a la función miembro BeginTrans del objeto CDatabase.

  2. Si no ha implementado la captura masiva de filas, llame a las funciones miembro AddNew/Update, Edit/Update y Delete de uno o varios objetos de conjunto de registros de la misma base de datos tantas veces como sea necesario. Para obtener más información, vea Conjunto de registros: agregar, actualizar y eliminar registros (ODBC). Si ha implementado la captura masiva de filas, debe escribir sus propias funciones para actualizar el origen de datos.

  3. Por último, llame a la función miembro CommitTrans del objeto CDatabase. Si se produce un error en una de las actualizaciones o decide cancelar los cambios, llame a su función miembro Rollback.

En el ejemplo siguiente se usan dos conjuntos de registros para eliminar la inscripción de un alumno de una base de datos de registro escolar, quitando al alumno de todas las clases en las que está inscrito. Dado que las llamadas a Delete de ambos conjuntos de registros deben realizarse correctamente, se requiere una transacción. En el ejemplo se da por sentada la existencia de m_dbStudentReg, una variable miembro de tipo CDatabase que ya está conectada al origen de datos, y las clases CEnrollmentSet y CStudentSet del conjunto de registros. La variable strStudentID contiene un valor obtenido del usuario.

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;

}

Nota:

Es un error llamar de nuevo a BeginTrans sin llamar a CommitTrans o Rollback.

Consulte también

Transacción (ODBC)
Transacción: Cómo afectan las transacciones a las actualizaciones (ODBC)
CDatabase (clase)
CRecordset (clase)