Một giải pháp đơn giản sẽ là đưa bộ đếm và người dùng chiến thắng vào mô hình Trò chơi. Sau đó, bạn có thể sử dụng select_for_update
để khóa hồ sơ:
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
Là một phần của cùng một giao dịch, bạn cũng có thể ghi lại Player
của đối tượng để bạn cũng biết ai đã nhấp và theo dõi thông tin khác nhưng không đặt số và người chiến thắng ở đó. Để sử dụng select_for_update
bạn cần sử dụng postgresql_psycopg2
phụ trợ.
Cập nhật: Vì django đặt tự động gửi theo mặc định, bạn phải bọc đoạn mã trên trong giao dịch nguyên tử. Từ django tài liệu
Bạn có thể trang trí chế độ xem của mình bằng @transaction.atomic
:
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()