트랜잭션: 레코드 집합에서 트랜잭션 수행(ODBC)
이 항목에서는 레코드 집합에서 트랜잭션을 수행하는 방법을 설명합니다.
참고 항목
한 수준의 트랜잭션만 지원됩니다. 트랜잭션을 중첩할 수 없습니다.
레코드 집합에서 트랜잭션을 수행하려면
개체의
CDatabase
멤버 함수를BeginTrans
호출합니다.대량 행 페치를 구현하지 않은 경우 필요에 따라 동일한 데이터베이스의 하나 이상의 레코드 집합 개체에 대한 , 및
Delete
멤버 함수를 호출AddNew/Update
Edit/Update
합니다. 자세한 내용은 레코드 집합: 레코드 추가, 업데이트 및 삭제(ODBC)를 참조하세요. 대량 행 페치를 구현한 경우 사용자 고유의 함수를 작성하여 데이터 원본을 업데이트해야 합니다.마지막으로 개체의
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 클래스