După conectarea prin PDO, acesta administrează tranzacţiile. Tranzacţiile oferă 4 caracteristici mari: Atomicitate, Consistenţă, Izolare şi Durabilitate (ACID). Altfel zis, orice operaţie realizată printr-o tranzacţie, chiar dacă se realizează în etape, va fi aplicată în siguranţă la baza de date, fără interferenţe de la alte conexiuni, atunci când este finalizată. Operaţiile din tranzacţie pot fi anulate automat la cerere (dacă tranzacţia nu a fost finalizată), lucru ce poate uşura detectarea erorilor.
Tranzacţiile sunt implementate prin "salvarea" lotului de schimbări pentru a fi aplicat deodată; astfel se îmbunătăţeşte eficienţa actualizărilor. Implicit, tranzacţiile pot face programele mai rapide şi mai robuste, dacă sunt folosite corect.
Din nefericire, nu toate bazele de date suportă tranzacţii, deci PDO trebuie să ruleze în mod "auto-commit" la deschiderea conexiunii. Modul auto-commit înseamnă că fiecare interogare care rulează are propria tranzacţie implicită, dacă baza de date suportă acest lucru, sau fără tranzacţii dacă baza de date nu suportă tranzacţii.
O tranzacţie se iniţiază cu metoda PDO::beginTransaction(). Dacă driverul folosit nu suportă tranzacţii, este lansată PDOException (în funcţie de setările pentru erori).
Pentru a termina tranzacţia se pot folosi PDO::commit() sau PDO::rollBack(), în funcţie de succesul codului rulat în timpul tranzacţiei.
Când programul se încheie sau când conexiunea este închisă, dacă mai există o tranzacţie nerezolvată, PDO o va închide cu rollBack. Aceasta este o măsură de siguranţă pentru a evita inconsistenţa în cazul în care programul se termină neaşteptat – dacă tranzacţia nu este încheiată, se consideră că ceva nu a funcţionat corect, deci este rulat rollBack pentru a păstra integritatea datelor.
Atenţie
Anularea automată a RollBack are loc dacă este iniţiată tranzacţia cu PDO::beginTransaction(). Dacă se iniţiază manual o interogare care începe o tranzacţie PDO, aceasta nu poate fi anulată dacă ceva nu funcţionează corect.
Exemplu. Executarea unui lot de instrucţiuni într-o tranzacţie
În exemplul următor, presupunem că am creat un set de intrări pentru un angajat nou, căruia i s-a atribuit ca ID 23. Suplimentar, pentru acea persoană trebuie înregistrat şi salariul. Se fac două actualizări separate, închise între instrucţiunile PDO::beginTransaction() şi PDO::commit(), pentru a ne asigura că nimeni nu va vedea modificările până când acestea nu sunt complete. Dacă apar erori, blocul de instrucţiuni anulează toate modificările de la începerea tranzacţiei şi afişează un mesaj de eroare.
<?php
try {
$dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', array(PDO::ATTR_PERSISTENT => true));
echo "Conectat\n";
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->beginTransaction();
$dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
$dbh->exec("insert into salarychange (id, amount, changedate) values (23, 50000, NOW())");
$dbh->commit();
} catch (Exception $e) {
$dbh->rollBack();
echo "Eroare: " . $e->getMessage();
}
?>
Nu sunt limite pentru actualizările din tranzacţie; pot fi realizate interogări complexe pentru a extrage datele, şi această informaţie se poate folosi pentru a construi mai multe actualizări şi interogări; atât timp cât tranzacţia este activă, nimeni altcineva nu poate modifica datele introduse. Acest lucru nu este 100% corect, dar este suficient pentru a descrie tranzacţiile.