Transakce: Provádění transakcí v sadě záznamů (ODBC)
Toto téma popisuje, jak provádět transakce v sadě záznamů.
[!POZNÁMKA]
Je podporována pouze jedna úroveň transakcí; transakce nemůžete vnořovat.
K provedení transakce v sadě záznamů
Zavolejte členskou funkci BeginTrans objektu CDatabase.
Nemáte-li naimplementováno hromadné načítání řádku, zavolejte členské funkce AddNew/Update, Edit/Update a Delete jednoho nebo více objektů sady záznamů ze stejné databáze tolikrát, kolikrát potřebujete.Další informace naleznete v tématu sady záznamů: Přidání, aktualizaci a odstranění záznamů (ODBC).Máte-li naimplementováno hromadné načítání řádku, musíte napsat své vlastní funkce pro aktualizaci zdroje dat.
Nakonec zavolejte členskou funkci CommitTrans objektu CDatabase.Pokud dojde k chybě v jedné z aktualizací nebo se rozhodnete zrušit změny, zavolejte členskou funkci Rollback.
Následující příklad používá dvě sady záznamů k odstranění studentského zápisu z registrační databáze školy, odebrání studenta ze všech tříd, ve kterých je student zapsán.Protože volání Delete v obou sadách záznamů musí proběhnout úspěšně, je požadována transakce.Příklad předpokládá existenci členské proměnné m_dbStudentReg, typ CDatabase je již připojen ke zdroji dat a tříd sady záznamů CEnrollmentSet a CStudentSet. Proměnná strStudentID obsahuje hodnotu, získanou od uživatele.
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;
}
[!POZNÁMKA]
Opětovné volání BeginTrans bez volání CommitTrans nebo Rollback je chybné.