Ide yang biasanya saya gunakan saat bekerja dengan transaksi terlihat seperti ini (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
}
Perhatikan bahwa, dengan ide ini, jika kueri gagal, Pengecualian harus dilemparkan:
- PDO bisa melakukannya, tergantung bagaimana Anda mengonfigurasinya
- Lihat
PDO::setAttribute
- dan
PDO::ATTR_ERRMODE
danPDO::ERRMODE_EXCEPTION
- Lihat
- jika tidak, dengan beberapa API lain, Anda mungkin harus menguji hasil fungsi yang digunakan untuk mengeksekusi kueri, dan membuat pengecualian sendiri.
Sayangnya, tidak ada sihir yang terlibat. Anda tidak bisa hanya meletakkan instruksi di suatu tempat dan melakukan transaksi secara otomatis:Anda masih harus menentukan kelompok kueri mana yang harus dieksekusi dalam suatu transaksi.
Misalnya, cukup sering Anda akan memiliki beberapa pertanyaan sebelum transaksi (sebelum begin
) dan beberapa kueri lainnya setelah transaksi (setelah commit
atau rollback
) dan Anda ingin kueri tersebut dijalankan apa pun yang terjadi (atau tidak) dalam transaksi.