Transação: realizando uma transação em um conjunto de registros (ODBC)
Este tópico explica como executar uma transação em um conjunto de registros.
Observação
Há suporte para apenas um nível de transações; você não pode aninhar transações.
Para executar uma transação em um conjunto de registros
Chame a função de membro
BeginTrans
do objetoCDatabase
.Se você não tiver implementado a busca de linhas em massa, chame as funções de membro
AddNew/Update
,Edit/Update
eDelete
de um ou mais objetos do conjunto de registros do mesmo banco de dados tantas vezes quantas forem necessárias. Para obter mais informações, confira Conjunto de registros: adicionar, atualizar e excluir registros (ODBC). Se você implementou a busca de linhas em massa, escreva suas próprias funções para atualizar a fonte de dados.Por fim, chame a função de membro
CommitTrans
do objetoCDatabase
. Se ocorrer um erro em uma das atualizações ou você decidir cancelar as alterações, chame a respectiva função de membroRollback
.
O exemplo a seguir usa dois conjuntos de registros para excluir o registro de um aluno de um banco de dados de registro escolar, removendo o aluno de todas as classes em que está registrado. Como as chamadas Delete
em ambos os conjuntos de registros devem ter êxito, uma transação é necessária. O exemplo pressupõe a existência de m_dbStudentReg
, uma variável de membro do tipo CDatabase
já conectada à fonte de dados e as classes CEnrollmentSet
e CStudentSet
do conjunto de registros. A variável strStudentID
contém um valor obtido do usuário.
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;
}
Observação
Chamar BeginTrans
novamente sem chamar CommitTrans
ou Rollback
é um erro.
Confira também
Transação (ODBC)
Transação: como as transações afetam atualizações (ODBC)
Classe CDatabase
Classe CRecordset