Partilhar via


Transação: Executando 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

Apenas um nível de transações é suportado. Não é possível aninhar transações.

Para executar uma transação em um conjunto de registros

  1. Chame a função membro CDatabase do objeto BeginTrans.

  2. Se não tiver implementado a extração de linhas em massa, chame as funções de membro AddNew/Update, Edit/Update e Delete de um ou mais recordsets do mesmo banco de dados, quantas vezes forem necessárias. Para obter mais informações, consulte Recordset: Adicionando, atualizando e excluindo registros (ODBC). Caso tenhas implementado a busca de linhas em massa, deverás escrever as tuas próprias funções para atualizar a fonte de dados.

  3. Finalmente, chame a função membro do objeto CDatabaseCommitTrans. Se ocorrer um erro numa das atualizações ou se decidires cancelar as alterações, chama a função Rollback de membro.

O exemplo a seguir usa dois conjuntos de registros para excluir a inscrição de um aluno de um banco de dados de registro escolar, removendo o aluno de todas as classes em que o aluno está matriculado. Como as Delete chamadas em ambos os conjuntos de registros devem ser bem-sucedidas, uma transação é necessária. O exemplo pressupõe a existência de m_dbStudentReg, uma variável membro do tipo CDatabase já conectada a uma fonte de dados, e as classes de conjunto de registros CEnrollmentSet e CStudentSet. A 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

Ligar BeginTrans novamente sem ligar CommitTrans ou Rollback é um erro.

Ver também

Transação (ODBC)
Transação: Como as transações afetam as atualizações (ODBC)
Classe CDatabase
Classe CRecordset