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
Llame a la función miembro
BeginTrans
del objetoCDatabase
.Si no ha implementado la captura masiva de filas, llame a las funciones miembro
AddNew/Update
,Edit/Update
yDelete
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.Por último, llame a la función miembro
CommitTrans
del objetoCDatabase
. Si se produce un error en una de las actualizaciones o decide cancelar los cambios, llame a su función miembroRollback
.
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)