PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tránh các điều kiện đua, Django + Heroku + PostgreSQL

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách trừ giây cho ngày giờ của postgres

  2. lỗi đa tham số với datetime_select

  3. Cách tạo bảng ảo để tạo chuỗi ngày trong PostgreSQL?

  4. Sự khác biệt giữa kiểu dữ liệu Bit và Boolean trong PostgreSQL

  5. Tạo người dùng PostgreSQL và thêm họ vào cơ sở dữ liệu