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

Kunci untuk SELECT sehingga proses lain tidak mendapatkan data lama

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan parameter sebagai nama kolom dalam fungsi Postgres

  2. Optimalkan rentang kueri cap waktu Postgres

  3. postgresql memigrasi JSON ke JSONB

  4. Jika hitungan PostgreSQL (*) selalu lambat, bagaimana cara membuat halaman kueri kompleks?

  5. Refactor kunci asing ke bidang