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

Menghindari kondisi balapan, Django + Heroku + PostgreSQL

Solusi sederhana adalah menempatkan pengguna penghitung dan pemenang dalam model Game. Anda kemudian dapat menggunakan select_for_update untuk mengunci rekaman:

game = Game.objects.select_for_update().get(pk=gamepk)
if game.number + 1 == X
    # he is a winner
    game.winner = request.user
    game.number = game.number + 1
    game.save()

else:
    # u might need to stop the game if a winner already decided

Sebagai bagian dari transaksi yang sama, Anda juga dapat merekam Player s objek sehingga Anda juga tahu siapa yang mengklik dan melacak info lain tetapi tidak mencantumkan nomor dan pemenang di sana. Untuk menggunakan select_for_update anda perlu menggunakan postgresql_psycopg2 bagian belakang.

Pembaruan: Sejak Django mengatur autocommit secara default, Anda harus membungkus kode di atas dalam transaksi atom. Dari django dokumen

Anda dapat menghias tampilan Anda dengan @transaction.atomic :

from django.db import transaction

@transaction.atomic
def viewfunc(request):
    # This code executes inside a transaction.
    do_stuff()



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jangan melakukan apa pun dalam prosedur pemicu

  2. Rails apa perbedaan dalam indeks unik dan validasi_uniqueness_of

  3. Apakah mungkin untuk mengubah urutan alami kolom di Postgres?

  4. default untuk kolom xxxx tidak dapat dilemparkan secara otomatis untuk mengetik boolean di Postgres DB

  5. Django 1.8 ArrayField menambahkan &memperpanjang