PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Autorollback di postgres menggunakan PDO

Itu bukan kesalahan PDO, itu melekat pada manajemen transaksi PostgreSQL. Lihat:

PostgreSQL tidak mengembalikan transaksi, tetapi mengaturnya ke status dibatalkan di mana ia hanya dapat memutar kembali, dan di mana semua pernyataan kecuali ROLLBACK laporkan kesalahan:

(Saya terkejut tidak menemukan ini dirujuk dalam dokumentasi resmi; saya pikir saya perlu menulis tambalan untuk memperbaikinya.)

Jadi. Saat Anda mencoba/menangkap dan menelan pengecualian di PDO, Anda menjebak pengecualian sisi PHP, tetapi Anda tidak mengubah fakta bahwa transaksi PostgreSQL dalam keadaan dibatalkan.

Jika Anda ingin dapat menerima pengecualian dan terus menggunakan transaksi, Anda harus buat SAVEPOINT sebelum setiap pernyataan yang mungkin gagal. Jika gagal, Anda harus ROLLBACK TO SAVEPOINT ...; . Jika berhasil Anda dapat RELEASE SAVEPOINT ...; . Ini membebankan overhead ekstra pada database untuk manajemen transaksi, menambahkan perjalanan pulang pergi, dan membakar ID transaksi lebih cepat (yang berarti PostgreSQL harus melakukan lebih banyak pekerjaan pembersihan latar belakang).

Secara umum lebih baik untuk mendesain SQL Anda sehingga tidak akan gagal dalam keadaan normal. Misalnya, Anda dapat memvalidasi sebagian besar kendala sisi klien, memperlakukan kendala sisi server sebagai tingkat jaminan kedua sambil menjebak sebagian besar kesalahan sisi klien.

Jika hal itu tidak praktis, buat aplikasi Anda toleran terhadap kesalahan, sehingga dapat mencoba lagi transaksi yang gagal. Kadang-kadang ini tetap diperlukan - misalnya, Anda biasanya tidak dapat menggunakan savepoints untuk memulihkan dari kebuntuan pembatalan transaksi atau kegagalan serialisasi. Ini juga berguna untuk menjaga transaksi yang rawan kegagalan sesingkat mungkin, melakukan pekerjaan minimum yang diperlukan, sehingga Anda memiliki lebih sedikit untuk melacak dan mengulangi.

Jadi:Jika memungkinkan, alih-alih menelan pengecualian, jalankan kode database yang rawan kegagalan dalam loop coba lagi. Pastikan kode Anda menyimpan catatan informasi yang diperlukan untuk mencoba ulang seluruh transaksi jika terjadi kesalahan, bukan hanya pernyataan terbaru.

Ingat, apa saja transaksi bisa gagal:DBA mungkin memulai ulang database untuk menerapkan tambalan, sistem mungkin kehabisan RAM karena tugas cron yang kabur, dll. Jadi, aplikasi yang toleran terhadap kegagalan adalah desain yang bagus.

Props untuk Anda untuk setidaknya menggunakan pengecualian PDO dan menangani pengecualian - Anda sudah jauh di depan sebagian besar pengembang.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengedit file dari Sublime Text 2 dari Command Line ketika SSH menjadi Vagrant Virtual Box (Mesin Linux Ubuntu)

  2. Bagaimana cara mengaktifkan VERBOSITY PostgreSQL dalam koneksi Django db?

  3. urutan kolom dalam pernyataan SELECT * - dijamin?

  4. Bagaimana Anda menggunakan variabel dalam skrip PostgreSQL sederhana?

  5. Penggantian substring PostgreSQL UPDATE