Ok, tôi nghĩ rằng tôi đã tìm ra điều này. Vấn đề nằm ở một vấn đề lâu dài với Django và Psycopg2. Về cơ bản, Psycopg2 sẽ tự động đưa ra câu lệnh BEGIN cho DB. Tuy nhiên, nếu Django cho rằng không có sửa đổi dữ liệu nào xảy ra, thì Django sẽ không đưa ra CAM KẾT khi kết thúc giao dịch.
Có một vài giải pháp cho vấn đề này, hãy xem http:// www. slideshare.net/OReillyOSCON/unbreak-your-django-application để biết thêm chi tiết. Lý tưởng nhất là bạn tắt các cam kết tự động (bằng cách đặt autocommit =True trong cài đặt DB của bạn, quy ước đặt tên khó xử). Điều này ngăn chặn các giao dịch trên các hàm chỉ đọc mà còn trên các hàm ghi, vì vậy bạn cần phải gói các hàm đó theo cách thủ công trong trình trang trí @commit_on_success.
Ngoài ra, chỉ cần thêm django.middleware.transaction.TransactionMiddleware vào các lớp Middleware của bạn. Điều này sẽ bao gồm mọi yêu cầu trong một giao dịch. Điều này cũng có nghĩa là gói các yêu cầu chỉ đọc trong một giao dịch một cách không cần thiết, nhưng đó là một giải pháp nhanh chóng và hiệu quả.