Tôi đang cố gắng để thực hiện (những gì tôi nghĩ là) một mô hình dữ liệu khá đơn giản đối với một bộ đếm:Hoạt động nguyên tử ở Django?
class VisitorDayTypeCounter(models.Model):
visitType = models.CharField(max_length=60)
visitDate = models.DateField('Visit Date')
counter = models.IntegerField()
Khi ai đó đi qua, nó sẽ tìm kiếm một hàng đó phù hợp với visitType và visitDate; nếu hàng này không tồn tại, nó sẽ được tạo với counter = 0.
Sau đó, chúng tôi tăng bộ đếm và lưu.
Mối quan tâm của tôi là quá trình này hoàn toàn là cuộc đua. Hai yêu cầu có thể đồng thời kiểm tra xem thực thể có ở đó không và cả hai đều có thể tạo ra nó. Giữa việc đọc bộ đếm và lưu kết quả, một yêu cầu khác có thể đi qua và tăng nó (dẫn đến số lượng mất).
Cho đến nay tôi chưa thực sự tìm thấy một cách tốt về điều này, hoặc trong tài liệu Django hoặc trong hướng dẫn (trên thực tế, có vẻ như hướng dẫn có điều kiện chủng tộc trong phần Bình chọn của nó).
Làm cách nào để thực hiện điều này một cách an toàn?
Vẫn không thể là cơ sở dữ liệu sẽ thực hiện truy vấn này qua hai kết nối riêng lẻ đồng thời và vẫn có điều kiện chủng tộc (xác suất thấp hơn)?Tất cả phụ thuộc vào các giao dịch ẩn xung quanh truy vấn này được lớp kết nối tạo ra nguyên tử op. –
Nếu bạn xem "Tại sao tôi Ghét Django" phát biểu từ DjangoCon, kiểu truy vấn này được đưa ra như là một cách thích hợp, điều kiện chủng tộc miễn phí để thực hiện một gia tăng trong SQL (hitch là ORM của Django không thể làm điều đó cho bạn). – iconoplast
Tôi sẽ xem các trang trình bày của bạn ... bạn đã xác nhận khá nhiều sự nghi ngờ rằng ORM sẽ không tự làm điều đó. Cảm ơn sự giúp đỡ! –