Transakce: Provádění transakcí v sadě záznamů (rozhraní 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. Pro více informací viz. Sada záznamů: Přidávání, aktualizování 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é.
Viz také
Odkaz
Koncepty
Transakce: Jak transakce ovlivňují aktualizace (rozhraní ODBC)