2010-11-17 29 views
13

Phương thức create() trong Django tạo ra một cá thể mô hình sau đó gọi save(), được gọi là kích hoạt commit. Vì vậy, không nên có bất kỳ sự khác biệt nào trong việc kích hoạt cam kết giao dịch.Django: Sự khác biệt giữa save() và create() từ góc độ giao dịch

Nhưng trong thực tế, thực hiện một phương pháp tạo ra một loạt các trường hợp mô hình bằng cách sử dụng create() trên Postgresql Tôi nhận được ngoại lệ transaction aborted, commands ignored until end of transaction. Phương thức này chạy tốt với các chương trình phụ trợ db không giao dịch. Ngoài ra, khi tôi thay thế create() s bằng:

m = Model(attr1=..., attr2=...) 
m.save() 

nó cũng chạy trên Postgresql.

Có sự khác biệt nào giữa việc sử dụng save()create() theo nghĩa giao dịch không?

chỉnh sửa: create() cũng đặt self._for_write = True trước khi gọi save(), nhưng tôi không thể theo dõi nó để xem nó có ảnh hưởng đến hành vi giao dịch hay không.

chỉnh sửa: mã ví dụ có thể được tìm thấy here.

Trả lời

12

Như bạn đã có thể nhìn thấy, create() is just a wrapper for save():

Các _for_write part có lẽ hầu hết có nghĩa là chỉ để lựa chọn cơ sở dữ liệu, vì vậy tôi sẽ không trả quá nhiều sự chú ý đến nó.

Và liên quan đến lỗi "giao dịch bị hủy bỏ" đó, mà không thấy mã của bạn, thật khó để nói vấn đề là gì. Có thể bạn, ví dụ: vi phạm ràng buộc UNIQUE với create(), khiến PostgreSQL yêu cầu rollback giao dịch, và sau đó bạn đã thử save() với các dữ liệu khác nhau - thật khó để nói mà không có mã chính xác.

+0

cảm ơn câu trả lời. tôi đã thêm liên kết vào mã ví dụ cho câu hỏi. xin vui lòng cho tôi biết nếu làm rõ thêm sẽ giúp đỡ. – omat

+0

Nó có thể là một số vấn đề giao dịch như thế này: http://stackoverflow.com/questions/2235318/how-do-i-deal-with-this-race-condition-in-django/2235624#2235624 (lưu ý rằng nó MySQL cụ thể), nhưng nhìn vào mã của bạn tôi thấy rằng hai phiên bản không tương đương - phiên bản làm việc 'get() s' bởi' slug' và 'create() s' với' name', trong khi phiên bản khác ' create() s' với 'name' ** và **' slug'. Vì vậy, có thể giả định này là đằng sau vấn đề. –

Các vấn đề liên quan