Sekarang Anda terhubung melalui PDO, sebelum memulai kueri, Anda harus terlebih dahulu memahami cara PDO mengelola transaksi.
Transaksi mendukung empat karakteristik utama (ACID):
atomisitas
Konsistensi
Isolasi
Daya tahan
Dalam istilah awam, setiap operasi yang dilakukan dalam suatu transaksi, meskipun dilakukan secara bertahap, dijamin akan diterapkan dengan aman ke database dan dilakukan tanpa gangguan dari koneksi lain.
Operasi transaksi juga dapat dibatalkan secara otomatis berdasarkan permintaan (dengan asumsi transaksi belum dilakukan), sehingga lebih mudah untuk menangani kesalahan dalam skrip.
Transaksi biasanya dilaksanakan dengan "mengumpulkan" sejumlah perubahan dan sekaligus menjadikannya efektif; keuntungan dari melakukan hal ini adalah dapat sangat meningkatkan efisiensi perubahan tersebut.
Dengan kata lain, transaksi dapat membuat skrip lebih cepat dan berpotensi lebih kuat (walaupun transaksi harus digunakan dengan benar untuk mendapatkan manfaat tersebut).
Sayangnya, tidak semua database mendukung transaksi, jadi PDO perlu dijalankan dalam mode "autocommit" saat koneksi pertama kali dibuka.
Mode komitmen otomatis berarti bahwa setiap kueri yang dijalankan memiliki transaksi implisitnya sendiri jika database mendukungnya, atau tidak ada jika database tidak mendukung transaksi.
Jika transaksi diperlukan, transaksi harus dimulai dengan metode PDO::beginTransaction(). Jika driver yang mendasarinya tidak mendukung transaksi, PDOException akan ditampilkan (ini adalah kondisi kesalahan serius, apa pun pengaturan penanganan kesalahannya).
Setelah transaksi dimulai, transaksi dapat diselesaikan dengan PDO::commit() atau PDO::rollBack(), bergantung pada apakah kode dalam transaksi berhasil dijalankan.
Catatan: PDO hanya memeriksa apakah ia memiliki kemampuan transaksi di tingkat driver. Jika beberapa kondisi runtime berarti transaksi tidak tersedia, dan layanan database menerima permintaan untuk memulai transaksi, PDO::beginTransaction() akan tetap mengembalikan TRUE tanpa kesalahan. Contoh yang baik adalah mencoba menggunakan transaksi dalam tabel MyISAM di database MySQL.
Ketika skrip berakhir atau koneksi akan ditutup, jika ada transaksi yang belum diselesaikan, PDO akan secara otomatis mengembalikan transaksi tersebut. Tindakan keamanan ini membantu menghindari inkonsistensi jika skrip berakhir secara tidak terduga - jika transaksi tidak dilakukan secara eksplisit, diasumsikan ada yang tidak beres, sehingga rollback dilakukan untuk menjaga keamanan data.
Catatan: Rollback otomatis hanya dapat terjadi setelah memulai transaksi melalui PDO::beginTransaction(). Jika Anda mengeluarkan kueri secara manual untuk memulai transaksi, PDO tidak memiliki cara untuk mengetahuinya dan tidak dapat mengembalikannya jika diperlukan.
Jalankan pemrosesan batch dalam suatu transaksi:
Dalam contoh berikut, asumsikan bahwa satu set entri dibuat untuk karyawan baru dan diberi ID 23. Selain mendaftarkan data dasar seseorang, juga perlu mencatat gajinya.
Sangat mudah untuk melakukan kedua pembaruan secara terpisah, namun dengan menyertakan keduanya dalam panggilan PDO::beginTransaction() dan PDO::commit(), Anda memastikan bahwa tidak ada orang lain yang dapat melihat perubahan hingga perubahan selesai.
Jika terjadi kesalahan, blok catch akan mengembalikan semua perubahan yang terjadi sejak transaksi dimulai dan mencetak pesan kesalahan.
<?phptry { $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', array(PDO::ATTR_PERSISTENT => true)); echo "Tersambungn";} catch (Pengecualian $e) { die("Tidak dapat terhubung: " . $e->getMessage());}coba { $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh->beginTransaction(); $dbh->exec("masukkan ke nilai staf (id, pertama, terakhir) (23, 'Joe ', 'Bloggs')"); $dbh->exec("masukkan ke nilai perubahan gaji (id, jumlah, tanggal perubahan) (23, 50000, SEKARANG())"); $dbh->commit(); } catch (Pengecualian $e) { $dbh->rollBack(); echo "Gagal: " . $e->getMessage();}?>
Anda tidak dibatasi untuk membuat perubahan dalam suatu transaksi, Anda juga dapat mengeluarkan kueri kompleks untuk mengekstrak data, dan Anda dapat menggunakan informasi tersebut untuk membuat lebih banyak perubahan dan kueri saat transaksi aktif, Anda dapat menjamin bahwa orang lain tidak dapat melakukan perubahan saat itu operasi sedang berlangsung.