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, jalankanROLLBACK PREPARED
pada database tempat transaksi telah disiapkan danROLLBACK
pada yang lain. -
Sekali
PREPARE TRANSACTION
telah berhasil di mana-mana, jalankanCOMMIT 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.