2012-08-29 12 views
8

Tôi có một cái gì đó như:Có select_for_update thả khóa vào lần lưu đầu tiên() hoặc ở cuối chế độ xem không?

newsletter = Newsletter.select_for_update().latest() 
newsletter.started_sending = timezone.now() 
newsletter.save() 

newsletter.send() 

Sau đó, nó đánh một điều kiện chủng tộc mà tôi đã gửi bản sao, có lẽ vì send() đã bị trúng hai công việc cron. Điều này khiến tôi nghĩ rằng khóa được phát hành vào lần lưu đầu tiên, khi tôi nghĩ rằng nó sẽ không được phát hành cho đến cuối màn hình.

Được phát hành vào lần lưu đầu tiên, phải không?

+0

https://docs.djangoproject.com/en/dev/ref/models/querysets/ –

+0

@pst Tôi đã đọc điều đó, đặc biệt là https://docs.djangoproject.com/en/dev/ref/models/querysets/# select-for-update. –

Trả lời

10

Từ https://docs.djangoproject.com/en/dev/topics/db/transactions/#topics-db-transactions-requirements

giao dịch mặc định của Django hành vi

hành vi mặc định của Django là để chạy với một giao dịch mở mà nó cam kết tự động khi bất kỳ built-in, chức năng mô hình dữ liệu làm thay đổi được gọi. Ví dụ, nếu bạn gọi model.save() hoặc model.delete(), thay đổi sẽ được thực hiện ngay lập tức.

+1

Tôi đoán câu trả lời cho câu hỏi ban đầu là "có"? – minghan

+2

@ mh512 có :). –