Pertanyaan Anda, merujuk pada sumber yang tidak dikenal:
Saya melihat penguncian baris, tetapi dikatakan Anda tidak dapat mencegah pernyataan pilihan yang sepertinya tidak akan berfungsi untuk kondisi saya di sini. Apakah saya satu-satunya pilihan untuk menggunakan kunci penasehat?
Dokumentasi resmi tentang masalah ini:
Kunci tingkat baris tidak memengaruhi kueri data; mereka hanya memblokir penulis dan loker ke baris yang sama.
Upaya serentak tidak hanya akan memilih tetapi mencoba mengeluarkan kunci tingkat baris yang sama dengan SELECT ... FOR UPDATE
- yang menyebabkan mereka menunggu transaksi sebelumnya yang memegang kunci pada baris yang sama untuk melakukan atau memutar kembali. Hanya apa yang Anda inginkan.
Namun , banyak kasus penggunaan lebih baik diselesaikan dengan advisory locks - dalam versi sebelum 9.5. Anda masih dapat mengunci baris yang sedang diproses dengan FOR UPDATE
tambahan agar aman. Tetapi jika transaksi berikutnya hanya ingin memproses "baris gratis berikutnya" sering banyak lebih efisien untuk tidak menunggu baris yang sama, yang hampir pasti tidak tersedia setelah kunci dilepaskan, tetapi langsung lompat ke "gratis berikutnya".
Di Postgres 9.5+ pertimbangkan FOR UPDATE SKIP LOCKED
untuk ini. Seperti komentar @Craig, ini sebagian besar dapat menggantikan kunci penasehat.
Pertanyaan terkait tersandung pada babi kinerja yang sama:
- Fungsi membutuhkan waktu lama untuk dijalankan untuk sejumlah besar catatan
Penjelasan dan contoh kode untuk advisory locks atau FOR UPDATE SKIP LOCKED
di Postgres 9.5+:
- PEMBARUAN Pascagres ... BATAS 1
Untuk mengunci banyak baris sekaligus :
- Cara menandai nr baris tertentu dalam tabel pada akses bersamaan