다음을 통해 공유


트랜잭션: 레코드 집합에서 트랜잭션 수행(ODBC)

이 항목에서는 레코드 집합에서 트랜잭션을 수행하는 방법을 설명합니다.

참고 항목

한 수준의 트랜잭션만 지원됩니다. 트랜잭션을 중첩할 수 없습니다.

레코드 집합에서 트랜잭션을 수행하려면

  1. 개체의 CDatabase 멤버 함수를 BeginTrans 호출합니다.

  2. 대량 행 페치를 구현하지 않은 경우 필요에 따라 동일한 데이터베이스의 하나 이상의 레코드 집합 개체에 대한 , 및 Delete 멤버 함수를 호출AddNew/UpdateEdit/Update합니다. 자세한 내용은 레코드 집합: 레코드 추가, 업데이트 및 삭제(ODBC)를 참조하세요. 대량 행 페치를 구현한 경우 사용자 고유의 함수를 작성하여 데이터 원본을 업데이트해야 합니다.

  3. 마지막으로 개체의 CommitTrans 멤버 함수를 CDatabase 호출합니다. 업데이트 중 하나에서 오류가 발생하거나 변경 내용을 취소하기로 결정한 경우 해당 멤버 함수를 Rollback 호출합니다.

다음 예제에서는 두 개의 레코드 집합을 사용하여 학교 등록 데이터베이스에서 학생의 등록을 삭제하고 학생이 등록된 모든 수업에서 학생을 제거합니다. 두 레코드 집합의 Delete 호출이 모두 성공해야 하므로 트랜잭션이 필요합니다. 이 예제에서는 데이터 원본에 m_dbStudentReg이미 연결된 형식 CDatabase 의 멤버 변수와 레코드 집합 클래스 및 CEnrollmentSet CStudentSet. 변수에는 strStudentID 사용자로부터 얻은 값이 포함됩니다.

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;

}

참고 항목

호출하지 않고 다시 호출 BeginTrans CommitTrans 하거나 Rollback 오류입니다.

참고 항목

트랜잭션(ODBC)
트랜잭션: 트랜잭션이 업데이트에 미치는 영향(ODBC)
CDatabase 클래스
CRecordset 클래스