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

Subpilihan PostgreSQL dan ActiveRecord untuk kondisi balapan

Pilihan Anda adalah:

  • Jalankan di SERIALIZABLE isolasi. Transaksi interdependen akan dibatalkan pada komit karena mengalami kegagalan serialisasi. Anda akan mendapatkan banyak spam log kesalahan, dan Anda akan melakukan banyak percobaan ulang, tetapi ini akan bekerja dengan andal.

  • Tentukan UNIQUE kendala dan coba lagi pada kegagalan, seperti yang Anda catat. Masalah yang sama seperti di atas.

  • Jika ada objek induk, Anda dapat SELECT ... FOR UPDATE objek induk sebelum melakukan max pertanyaan. Dalam hal ini Anda akan SELECT 1 FROM bar WHERE bar_id = $1 FOR UPDATE . Anda menggunakan bar sebagai kunci untuk semua foo s dengan bar_id itu . Anda kemudian dapat mengetahui bahwa aman untuk melanjutkan, selama setiap kueri yang melakukan peningkatan penghitung Anda melakukannya dengan andal. Ini bisa bekerja dengan baik.

    Ini masih melakukan kueri agregat untuk setiap panggilan, yang (per opsi berikutnya) tidak diperlukan, tetapi setidaknya itu tidak mengirim spam ke log kesalahan seperti opsi di atas.

  • Gunakan meja penghitung. Inilah yang akan saya lakukan. Baik di bar , atau di tabel samping seperti bar_foo_counter , dapatkan ID baris menggunakan

    UPDATE bar_foo_counter SET counter = counter + 1
    WHERE bar_id = $1 RETURNING counter
    

    atau opsi yang kurang efisien jika kerangka kerja Anda tidak dapat menangani RETURNING :

    SELECT counter FROM bar_foo_counter
    WHERE bar_id = $1 FOR UPDATE;
    
    UPDATE bar_foo_counter SET counter = $1;
    

    Kemudian, dalam transaksi yang sama , gunakan baris penghitung yang dihasilkan untuk number . Saat Anda melakukan, baris tabel penghitung untuk bar_id itu akan dibuka untuk kueri berikutnya untuk digunakan. Jika Anda memutar kembali, perubahan akan dibuang.

Saya merekomendasikan pendekatan penghitung, menggunakan tabel samping khusus untuk penghitung alih-alih menambahkan kolom ke bar . Itu lebih bersih untuk dimodelkan, dan berarti Anda membuat lebih sedikit pembaruan mengasapi di bar , yang dapat memperlambat kueri ke bar .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konektor PostgreSQL di OSGi

  2. Temukan baris dengan beberapa bidang duplikat dengan Rekaman Aktif, Rel &Postgres

  3. Cara menyimpan objek JSON ke PostgreSQL menggunakan tipe data JSONB di dalam tabel dan driver JDBC PostgreSQL

  4. Migrasi rel untuk skema postgreSQL

  5. Melewati variabel C ke perintah SQL