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

Mengontrol durasi menunggu kunci PostgreSQL

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 .

  1. 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. Jika statement_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.

  2. 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.

  3. Tidak. Anda harus:

    BEGIN;
    SET LOCAL lock_timeout = '4s';
    SELECT ....;
    COMMIT;
    
  4. 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cara mendapatkan input pengguna dari qdateEdit dan memilihnya dari database di postgres

  2. Django haystack dengan Elasticsearch tidak dapat menemukan database saat membangun kembali indeks

  3. JPA enum (java.lang.ClassCastException:org.postgresql.util.PGobject)

  4. postgres array_agg ERROR:tidak dapat mengakumulasi array dengan dimensi berbeda

  5. Bagaimana cara saya menulis kueri Django dengan subkueri sebagai bagian dari klausa WHERE?