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()