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

Skenario konkurensi dengan INSERT

Masalah Anda bermuara pada pertanyaan "apa yang seharusnya menjadi kunci sinkronisasi" . Dari pertanyaan Anda tampaknya pemesanan tersebut bukan pemesanan barang tertentu. Tapi mari kita asumsikan, bahwa pengguna memesan kamar hotel tertentu sehingga Anda perlu menyelesaikan dua masalah:

  • mencegah pemesanan berlebih (mis. memesan barang yang sama untuk dua orang)
  • mencegah kesalahan perhitungan status akun paralel

Jadi, ketika pengguna mencapai titik ketika dia akan menekan konfirmasi tombol, ini adalah skenario yang mungkin dapat Anda terapkan:

  1. mulai transaksi

  2. mengunci entri pengguna sehingga proses paralel diblokir

    SELECT * FROM user FOR UPDATE WHERE id = :id

  3. cek ulang saldo rekening dan lempar exception/rollback jika dana tidak mencukupi

  4. mengunci item yang akan dipesan untuk mencegah overbooking

    SELECT * FROM room FOR UPDATE WHERE id = :id

  5. cek kembali ketersediaan booking dan lempar exception/rollback jika barang sudah dipesan

  6. buat entri pemesanan dan kurangi dana dari akun pengguna

  7. komit transaksi (semua kunci akan dilepaskan)

Jika, dalam kasus Anda, Anda tidak perlu memeriksa pemesanan berlebih, lewati / abaikan langkah 4 dan 5.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Postgres RAISE EXCEPTION diubah menjadi PDOException?

  2. Bagaimana mengubah max_connections untuk Postgres melalui perintah SQL

  3. Kesalahan soket Postgresql pada OSX 10.7.3 saat menjalankan syncdb . Django

  4. PSQLException:Objek Besar tidak boleh digunakan dalam mode komit otomatis

  5. Bagaimana cara menambahkan wadah buruh pelabuhan ke jaringan buruh pelabuhan yang ada