Den idé, jeg generelt bruger, når jeg arbejder med transaktioner, ser sådan ud (semi-pseudo-kode) :
try {
// First of all, let's begin a transaction
$db->beginTransaction();
// A set of queries; if one fails, an exception should be thrown
$db->query('first query');
$db->query('second query');
$db->query('third query');
// If we arrive here, it means that no exception was thrown
// i.e. no query has failed, and we can commit the transaction
$db->commit();
} catch (\Throwable $e) {
// An exception has been thrown
// We must rollback the transaction
$db->rollback();
throw $e; // but the error must be handled anyway
}
Bemærk, at med denne idé, hvis en forespørgsel mislykkes, skal der gives en undtagelse:
- PDO kan gøre det, afhængigt af hvordan du konfigurerer det
- Se
PDO::setAttribute
- og
PDO::ATTR_ERRMODE
ogPDO::ERRMODE_EXCEPTION
- Se
- ellers, med en anden API, skal du muligvis teste resultatet af den funktion, der bruges til at udføre en forespørgsel, og selv kaste en undtagelse.
Desværre er der ingen magi involveret. Du kan ikke bare placere en instruktion et sted og få transaktioner udført automatisk:du skal stadig angive, hvilken gruppe af forespørgsler, der skal udføres i en transaktion.
For eksempel vil du ofte have et par forespørgsler før transaktionen (før begin
) og endnu et par forespørgsler efter transaktionen (efter enten commit
eller rollback
) og du vil have disse forespørgsler udført, uanset hvad der skete (eller ej) i transaktionen.