Urusan PDO PHP dan auto-commit
Sekarang terhubung melalui PDO pergi sebelum dimulainya query, Anda harus terlebih dahulu memahami bagaimana PDO adalah untuk mengelola urusan.
dukungan transaksi empat sifat (ACID):
- Atomicity (atomicity)
- Konsistensi (konsistensi)
- Isolasi (isolasi)
- Persistent (Durability)
Lebih sederhana, operasi pun dilakukan dalam suatu transaksi, bahkan penerapan secara bertahap, tetapi juga untuk menjamin keamanan yang diterapkan untuk database, dan tidak akan diserahkan dalam gangguan waktu dari koneksi lain.
operasi transaksi juga dapat secara otomatis dicabut atas permintaan (dengan asumsi belum diserahkan), yang membuatnya lebih mudah untuk menangani kesalahan dalam naskah.
Transaksi ini biasanya dilakukan oleh sejumlah perubahan "tabungan" dan kemudian dibiarkan berlaku dan dilaksanakan; manfaat untuk melakukannya adalah untuk memberikan efisiensi ini dapat sangat berubah.
Dengan kata lain, transaksi dapat membuat script Anda lebih cepat dan berpotensi lebih kuat (Anda masih perlu untuk menggunakannya dengan benar untuk menuai manfaat yang).
Sayangnya, tidak setiap database yang mendukung transaksi, jadi ketika Anda pertama kali membuka koneksi, PDO membutuhkan disebut "auto-komit" mode operasi.
Auto-komit modus berarti bahwa jika dukungan database, setiap query dijalankan memiliki transaksi implisit sendiri, jika database tidak mendukung transaksi, tidak ada.
Jika Anda membutuhkan transaksi, Anda harus menggunakan metode PDO :: beginTransaction () untuk memulai. Jika driver yang mendasari tidak mendukung transaksi, melemparkan PDOException pengecualian (terlepas dari apa jenis pengaturan penanganan error, ini adalah kondisi kesalahan serius).
Setelah transaksi tersedia PDO :: komit () atau PDO :: rollback () untuk menyelesaikan, tergantung pada kode transaksi berjalan dengan sukses.
Catatan: PDO hanya apakah kemampuan pemrosesan transaksi dalam pemeriksaan lapisan driver. Jika beberapa kondisi runtime berarti bahwa transaksi tidak tersedia, dan layanan database menerima permintaan untuk memulai transaksi, PDO :: beginTransaction () masih akan mengembalikan TRUE dan tidak ada kesalahan. Coba gunakan transaksi adalah contoh yang baik dalam tabel database MyISAM MySQL.
Ketika script berakhir atau sambungan akan segera ditutup, jika tidak ada transaksi selesai, PDO otomatis akan memutar kembali transaksi. mengukur keamanan membantu untuk menghindari inkonsistensi dalam script berakhir tiba-tiba - jika tidak secara eksplisit melakukan transaksi, maka asumsi yang salah di suatu tempat, sehingga rollback dilakukan untuk memastikan keamanan data.
Catatan: Hanya memulai transaksi PDO :: beginTransaction () kemudian, mungkin terjadi secara otomatis dibatalkan. Jika Anda secara manual mengeluarkan permintaan untuk memulai transaksi, PDO tidak bisa tahu, sehingga, jika perlu, tidak dapat diperpanjang kembali.
Dalam transaksi mengeksekusi bets:
Pada contoh berikut, misalkan Anda membuat satu set entri untuk karyawan baru, menetapkan ID 23 adalah. Selain data dasar orang pendaftaran, tetapi juga Anda perlu untuk merekam gajinya.
Kedua update selesai itu sangat sederhana, tapi dengan menutup PDO :: beginTransaction () dan PDO :: komit () panggilan, adalah mungkin untuk memastikan bahwa sebelum perubahan, orang lain tidak dapat melihat perubahan ini.
Jika terjadi kesalahan, menangkap memblokir semua perubahan sejak transaksi tersebut digulung kembali dari awal, dan output pesan kesalahan.
<?php try { $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', array(PDO::ATTR_PERSISTENT => true)); echo "Connected\n"; } catch (Exception $e) { die("Unable to connect: " . $e->getMessage()); } try { $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 "Failed: " . $e->getMessage(); } ?>
Tidak terbatas pada perubahan dalam transaksi, dapat mengeluarkan pertanyaan yang kompleks untuk mengambil data, tetapi juga untuk membangun lebih banyak perubahan dan query menggunakan informasi yang, ketika transaksi aktif, Anda dapat memastikan bahwa orang lain tidak bisa membuat perubahan dalam operasi berlangsung.