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

Di PostgreSQL, apakah beberapa UPDATE ke baris berbeda dalam tabel yang sama memiliki kunci yang saling bertentangan?

UPDATE mengunci baris, jadi Anda tidak perlu menguncinya terlebih dahulu. Jika Anda mencoba UPDATE tumpang tindih set baris secara bersamaan, UPDATE kedua akan menunggu transaksi pertama untuk melakukan atau memutar kembali.

Masalah besar dengan pendekatan Anda - selain fakta bahwa UPDATE tidak memiliki LIMIT klausa - adalah bahwa banyak pekerja semuanya akan mencoba mengambil baris yang sama. Inilah yang terjadi:

  • worker1:Memfilter tabel untuk menemukan 200 baris dan menguncinya
  • worker1:mulai memperbarui baris
  • worker2:memfilter tabel untuk menemukan 200 baris
  • worker2:mencoba untuk mulai memperbarui baris, tetapi telah memilih baris yang sama dengan worker1 sehingga memblokir kunci worker1
  • worker1:Selesai memperbarui baris
  • worker2:Setelah kunci dilepas, periksa kembali kondisi WHERE dan temukan bahwa tidak ada baris yang cocok lagi karena worker1 telah memperbaruinya. Memperbarui nol baris.

... dan ulangi!

Anda harus:

  • Memiliki antrian pusat membagi-bagikan baris dengan cara aman-konkurensi yang tepat; atau
  • Tetapkan rentang ID yang tidak tumpang tindih untuk dikerjakan oleh pekerja

Adapun LIMIT - Anda bisa menggunakan WHERE id IN (SELECT t.id FROM thetable t LIMIT 200 ORDER BY id) - tetapi Anda akan memiliki masalah yang sama dengan kedua pekerja memilih kumpulan baris yang sama untuk diperbarui.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pemetaan hibernasi antara Enum PostgreSQL dan Java enum

  2. Menggunakan Kursor untuk paging di PostgreSQL

  3. Bagaimana menjalankan perintah PostgreSQL RAISE secara dinamis

  4. Bagaimana cara menggunakan SQL for loop untuk memasukkan baris ke dalam database?

  5. Hapus keunikan indeks di PostgreSQL