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

Menggunakan dua fase komit pada postgres

Saya pikir Anda salah paham PREPARE TRANSACTION .

Pernyataan itu mengakhiri pekerjaan pada transaksi, yaitu, harus dikeluarkan setelah semua pekerjaan selesai. Idenya adalah PREPARE TRANSACTION melakukan segala sesuatu yang berpotensi gagal selama komit kecuali untuk komit itu sendiri. Itu untuk menjamin bahwa COMMIT PREPARED berikutnya tidak bisa gagal.

Idenya adalah bahwa pemrosesan adalah sebagai berikut:

  • Jalankan START TRANSACTION pada semua database yang terlibat dalam transaksi terdistribusi.

  • Lakukan semua pekerjaan. Jika ada kesalahan, ROLLBACK semua transaksi.

  • Jalankan PREPARE TRANSACTION pada semua database. Jika gagal, jalankan ROLLBACK PREPARED pada database tempat transaksi telah disiapkan dan ROLLBACK pada yang lain.

  • Sekali PREPARE TRANSACTION telah berhasil di mana-mana, jalankan COMMIT PREPARED pada semua database yang terlibat.

Dengan begitu, Anda dapat menjamin "semua atau tidak sama sekali" di beberapa database.

Salah satu komponen penting di sini yang belum saya sebutkan adalah manajer transaksi terdistribusi . Ini adalah bagian dari perangkat lunak yang terus-menerus mengingat di mana pemrosesan algoritme di atas saat ini berada sehingga dapat membersihkan atau terus melakukan setelah crash.

Tanpa manajer transaksi terdistribusi, komit dua fase tidak bernilai banyak, dan sebenarnya berbahaya:jika transaksi terjebak dalam fase "disiapkan" tetapi belum dilakukan, mereka akan terus mengunci dan (dalam kasus PostgreSQL) memblokir pekerjaan autovacuum bahkan melalui restart server , karena transaksi semacam itu harus terus-menerus.

Ini sulit untuk diperbaiki.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kembalikan Semua Catatan Historis untuk Akun dengan Perubahan Nilai Terkait Tertentu

  2. Waktu eksekusi Kueri Postgres

  3. gunakan perintah database_name di PostgreSQL

  4. Konversi Nomor Bulan ke Nama Bulan di PostgreSQL

  5. Ulangi tabel dengan PL/pgSQL di Postgres 9.0+