Het idee dat ik over het algemeen gebruik bij het werken met transacties ziet er als volgt uit:(semi-pseudo-code) :
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
}
Merk op dat, met dit idee, als een query mislukt, er een uitzondering moet worden gegenereerd:
- PDO kan dat doen, afhankelijk van hoe je het configureert
- Zie
PDO::setAttribute
- en
PDO::ATTR_ERRMODE
enPDO::ERRMODE_EXCEPTION
- Zie
- anders, met een andere API, moet u mogelijk het resultaat testen van de functie die wordt gebruikt om een query uit te voeren, en zelf een uitzondering maken.
Helaas is er geen magie bij betrokken. Je kunt niet zomaar ergens een instructie plaatsen en transacties automatisch laten doen:je moet nog specificeren welke groep queries in een transactie moet worden uitgevoerd.
U zult bijvoorbeeld vrij vaak een aantal vragen hebben voor de transactie (voordat de begin
) en nog een paar vragen na de transactie (na ofwel commit
of rollback
) en je wilt dat die zoekopdrachten worden uitgevoerd, wat er ook is gebeurd (of niet) in de transactie.