Transacción: Realizar una transacción en un conjunto de registros (ODBC)
Este tema explica cómo realizar una transacción en un conjunto de registros.
Nota
Sólo se admite un nivel de transacciones; no es posible anidar las transacciones.
Para realizar una transacción en un conjunto de registros
Llame a la función miembro BeginTrans del objeto CDatabase.
Si no está implementada la obtención de filas masiva, llame a las funciones miembro AddNew/Update, Edit/Update y Delete de uno o más objetos de conjunto de registros correspondientes a 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 está implementada la obtención de filas masiva, debe escribir sus propias funciones para actualizar el origen de datos.
Por último, llame a la función miembro CommitTrans del objeto CDatabase. Si ocurre un error en una de las actualizaciones o decide cancelar los cambios, llame a su función miembro Rollback.
El ejemplo siguiente usa dos conjuntos de registros para eliminar la inscripción de un estudiante de una base de datos de registro de estudiantes, quitando al estudiante de todas las clases en que se inscribió. Deben ejecutarse con éxito las llamadas a Delete en ambos conjuntos de registros, por lo que se requiere una transacción. El ejemplo supone la existencia de m_dbStudentReg, una variable miembro del tipo CDatabase ya conectada al origen de datos, y de las clases de conjunto de registros CEnrollmentSet y CStudentSet. 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
Si se llama de nuevo a BeginTrans sin llamar a CommitTrans o Rollback, se produce un error.
Vea también
Referencia
Conceptos
Transacción: Cómo afectan las transacciones a las actualizaciones (ODBC)