Bagian kuncinya adalah untuk menyetel PDO dalam mode pengecualian, sementara mencoba-tangkap hanya untuk melakukan rollback tidak diperlukan. Dengan demikian, kode Anda baik-baik saja, tidak perlu mengubahnya jika yang Anda inginkan hanyalah mengembalikan jika gagal, selama Anda memiliki baris ini di suatu tempat:
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
Jika gagal, skrip akan dihentikan, koneksi ditutup dan mysql akan dengan senang hati mengembalikan transaksi untuk Anda.
Jika Anda masih ingin mengembalikan secara manual, Anda harus melakukannya dengan benar, tidak seperti yang dikatakan dalam jawaban lain. Pastikan bahwa
- Anda menangkap
Exception
, bukanPDOException
, karena tidak peduli pengecualian tertentu apa yang membatalkan eksekusi - Anda melempar ulang pengecualian setelah rollback, untuk diberi tahu tentang masalahnya
- juga bahwa mesin tabel mendukung transaksi (yaitu untuk Mysql seharusnya InnoDB, bukan MyISAM).
Daftar periksa ini diambil dari artikel saya yang mungkin berguna bagi Anda dalam hal ini atau banyak aspek lainnya juga.