Transação: Executar 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; não é possível aninhar transações. |
Para executar uma transação em um conjunto de registros
telefonar the CDatabase objeto BeginTransfunção de membro .
Se não tiver implementado em massa linha buscar, telefonar o AddNew/atualizar, edição/atualizar, and Excluir funções de membro de um ou mais objetos de conjunto de registros do mesmo banco de dados quantas vezes for necessário.Para obter mais informações, consulte conjunto de registros: Adicionando, atualização e exclusão de registros (ODBC).Se tiver implementado em massa linha busca, você deve escrever suas próprias funções para atualização a fonte de dados.
Por fim, telefonar o CDatabase objeto CommitTransfunção de membro .Se ocorrer um erro em uma das atualizações ou decidir cancelar as alterações, chamar sua Reversãofunção de membro .
O exemplo a seguir utiliza dois conjuntos de registros para excluir o inscrição de um aluno de um banco de dados de inscrição da escola, removendo o aluno de todas as classes em que o aluno está inscrito.Porque o Excluir chamadas em ambos os conjuntos de registros devem ter êxito, uma transação é necessária.O exemplo supõe a existência de m_dbStudentReg, uma variável de membro de tipo CDatabase já conectado à fonte de dados e as classes de conjunto de registros CEnrollmentSet e CStudentSet. The strStudentID variável 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: |
---|
Chamada BeginTrans novamente sem chamar CommitTrans or Reversão é um erro. |
Consulte também
Conceitos
Transação: Como transações afetam atualizações (ODBC)