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

Bagaimana cara menghindari kondisi balapan saat menggunakan metode find_or_create dari DBIx::Class::ResultSet?

Tidak, dokumentasinya salah. Menggunakan transaksi saja tidak menghindari masalah ini. Ini hanya menjamin bahwa seluruh transaksi dibatalkan jika pengecualian harus terjadi - sehingga tidak ada status yang tidak konsisten yang dipertahankan ke database.

Untuk menghindari masalah ini Anda harus mengunci meja - di dalam transaksi, karena semua kunci dilepaskan pada akhir transaksi. Sesuatu seperti:

BEGIN;
LOCK TABLE mytbl IN SHARE MODE;

-- do your find_or_create here

COMMIT;

Tapi itu bukan obat ajaib untuk semuanya. Ini bisa menjadi masalah kinerja, dan mungkin ada kebuntuan (transaksi bersamaan yang saling mencoba mengunci sumber daya yang sudah dikunci oleh yang lain). PostgreSQL akan mendeteksi kondisi seperti itu dan membatalkan semua kecuali satu transaksi yang bersaing. Anda harus siap untuk mencoba kembali operasi jika gagal.

Panduan PostgreSQL tentang kunci.

Jika Anda tidak memiliki banyak konkurensi, Anda mungkin juga mengabaikan masalahnya. Slot waktu sangat kecil sehingga sangat jarang benar-benar terjadi. Jika Anda menemukan kesalahan pelanggaran kunci duplikat, yang tidak akan membahayakan, maka Anda juga telah mengatasinya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa yang saya perlukan agar pg_dumpall berfungsi tanpa kata sandi?

  2. Mengapa Postgresql gagal dengan Geokit seperti ini?

  3. Pengurutan Ulang Catatan PostgreSQL menggunakan Pembaruan dengan Sub-Pilih

  4. Saya tidak dapat terhubung ke Postgres DB dengan Strapi di Heroku

  5. Postgres now() vs 'sekarang' dalam fungsi