Tidak. FOR UPDATE
hanya mengunci baris tersebut , sehingga transaksi lain yang mencoba menguncinya (dengan FOR SHARE
, FOR UPDATE
, UPDATE
atau DELETE
) memblokir hingga transaksi Anda selesai atau dibatalkan.
Jika Anda menginginkan seluruh kunci tabel yang memblokir penyisipan/pembaruan/penghapusan, Anda mungkin ingin LOCK TABLE ... IN EXCLUSIVE MODE
.
-
Lihat
lock_timeout
pengaturan . Ini ditambahkan di 9.3 dan tidak tersedia di versi yang lebih lama.Perkiraan kasar untuk versi yang lebih lama dapat dicapai dengan
statement_timeout
, tetapi itu dapat menyebabkan pernyataan dibatalkan secara tidak perlu. Jikastatement_timeout
adalah 1s dan pernyataan menunggu 950ms pada kunci, mungkin kemudian mendapatkan kunci dan melanjutkan, hanya untuk segera dibatalkan oleh batas waktu. Bukan yang Anda inginkan.Tidak ada cara tingkat kueri untuk menyetel
lock_timeout
, tapi Anda bisa dan seharusnya:SET LOCAL lock_timeout = '1s';
setelah Anda
BEGIN
sebuah transaksi. -
Ada pernyataan batas waktu, tetapi kunci ditahan pada transaksi tingkat. Tidak ada fitur batas waktu transaksi.
Jika Anda menjalankan transaksi satu pernyataan, Anda cukup menyetel
statement_timeout
sebelum menjalankan pernyataan untuk membatasi berapa lama itu bisa berjalan. Ini tidak sama dengan membatasi berapa lama ia dapat menahan kunci, karena mungkin menunggu 900 mdtk dari 1 detik yang diizinkan untuk kunci, hanya benar-benar menahan kunci selama 100 md, lalu dibatalkan pada waktu habis. -
Tidak. Anda harus:
BEGIN; SET LOCAL lock_timeout = '4s'; SELECT ....; COMMIT;
-
SET LOCAL
cocok, dan disukai, untuk ini.Tidak ada cara untuk melakukannya dalam teks kueri, itu harus berupa pernyataan terpisah.
Pos milis yang Anda tautkan adalah proposal untuk sintaks imajiner yang tidak pernah diterapkan (setidaknya dalam rilis PostgreSQL publik) dan tidak ada.
Dalam situasi seperti ini, Anda mungkin ingin mempertimbangkan "kontrol konkurensi optimis", sering disebut "penguncian optimis". Ini memberi Anda kontrol yang lebih besar atas perilaku penguncian dengan biaya peningkatan tingkat pengulangan kueri dan kebutuhan akan lebih banyak logika aplikasi.