Добре, мисля, че разбрах това. Проблемът е в дългогодишен проблем с Django и Psycopg2. По принцип Psycopg2 автоматично ще издаде оператор BEGIN към DB. Въпреки това, ако Django смята, че не е настъпила промяна на данните, той няма да издаде COMMIT в края на транзакцията.
Има няколко решения на този проблем, вижте http://www. slideshare.net/OReillyOSCON/unbreaking-your-django-application за повече информация. В идеалния случай изключвате автоматичните ангажименти (като зададете autocommit =True в настройките на вашата DB, неудобна конвенция за именуване). Това предотвратява транзакции на функции само за четене, но също и на функции за запис, така че трябва ръчно да опаковате тези функции в @commit_on_success декоратор.
Като алтернатива просто добавете django.middleware.transaction.TransactionMiddleware към вашите класове Middleware. Това ще обвие всяка заявка в транзакция. Това означава и ненужно обвиване на заявки само за четене в транзакция, но това е бързо и мръсно решение.