गेम मॉडल में काउंटर और विजेता उपयोगकर्ता डालने का एक आसान समाधान होगा। फिर आप select_for_update
. का उपयोग कर सकते हैं रिकॉर्ड लॉक करने के लिए:
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
उसी लेन-देन के भाग के रूप में आप Player
. भी रिकॉर्ड कर सकते हैं s ऑब्जेक्ट्स ताकि आप यह भी जान सकें कि किसने क्लिक किया और अन्य जानकारी को ट्रैक किया, लेकिन नंबर और विजेता को वहां न डालें। select_for_update
use का उपयोग करने के लिए आपको postgresql_psycopg2
. का उपयोग करने की आवश्यकता है बैकएंड।
अपडेट करें: चूंकि django डिफ़ॉल्ट रूप से ऑटोोकॉमिट सेट करता है, इसलिए आपको उपरोक्त कोड को परमाणु लेनदेन में लपेटना होगा। django से docs
आप अपने विचार को @transaction.atomic
. से सजा सकते हैं :
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()