Đây là một ví dụ đơn giản của một cái nhìn django với một điều kiện chủng tộc tiềm năng:điều kiện Race trong django
# myapp/views.py
from django.contrib.auth.models import User
from my_libs import calculate_points
def add_points(request):
user = request.user
user.points += calculate_points(user)
user.save()
Các điều kiện chủng tộc nên khá rõ ràng: Người dùng có thể thực hiện yêu cầu này hai lần, và các ứng dụng có thể có khả năng thực hiện đồng thời user = request.user
, khiến một trong các yêu cầu ghi đè lên đối tượng kia.
Giả sử hàm calculate_points
tương đối phức tạp và tính toán dựa trên tất cả các loại công cụ lạ không thể đặt trong một đơn update
và sẽ khó đặt trong quy trình được lưu trữ.
Vì vậy, đây là câu hỏi của tôi: Những loại cơ chế khóa có sẵn để django, để đối phó với các tình huống tương tự như thế này?
Mở đầu tiên vượt qua, có vẻ như bạn cần cơ sở dữ liệu cấp khóa trên hàng trong câu hỏi vào thời điểm đó. Tôi sẽ tham khảo tài liệu SQL cho cơ sở dữ liệu của bạn và gửi một truy vấn tùy chỉnh để thực hiện nó. –
Tôi thích giải pháp "cơ sở dữ liệu bất khả tri" nếu nó có thể thực hiện được. – Fragsworth
'@ transaction.commit_on_success' +' QuerySet.select_for_update() ' – orokusaki