Postgres memang mendukung transaksi bersarang, tetapi berbeda dari SQL konvensional, lebih seperti transaksi dengan titik parsial bersarang.
Di tingkat atas, Anda selalu memiliki BEGIN/COMMIT/ROLLBACK
khas Anda , dan pada level bertingkat Anda harus menggunakan perintah berikut:
SAVEPOINT name
- membuat savepoint baru, dengan nama unik untuk transaksiRELEASE SAVEPOINT name
- melakukan savepoint, meskipun itu hanya akan bertahan jika transaksi yang mengandung melakukanROLLBACK TO SAVEPOINT name
- mengembalikan savepoint
Anda juga harus memastikan bahwa:
- Nama yang digunakan untuk setiap
SAVEPOINT
unik; - Kegagalan dalam satu
SAVEPOINT
disebarkan ke atas ke tingkat atas.
Bagian terakhir agak rumit, kecuali jika Anda menggunakan perpustakaan yang dapat melakukannya untuk Anda secara otomatis.
Ketika saya menulis pg-promise, saya memastikan bahwa kedua ketentuan itu dijamin:
- Ini menghasilkan nama save-point secara otomatis, sebagai
level_1
,level_2
, dan seterusnya, berdasarkan tingkat transaksi; - Dieksekusi berisi
ROLLBACK TO SAVEPOINT name
, ditambahROLLBACK
tingkat atas jika transaksi anak gagal - semuanya dibangun di atas logika standar rantai janji.
Lihat juga batasan transaksi bersarang PostgreSQL yang dijelaskan...