Ответ 1
Хорошо, я думаю, что понял это. Проблема заключается в давней проблеме с Django и Psycopg2. В принципе, Psycopg2 автоматически выдает инструкцию BEGIN в БД. Однако, если Django считает, что никаких изменений в данных не произошло, он не выдает COMMIT в конце транзакции.
Есть несколько решений этой проблемы, посмотрите на http://www.slideshare.net/OReillyOSCON/unbreaking-your-django-application для получения более подробной информации. В идеале вы отключите автоматические коммиты (установив autocommit = True в настройках вашего БД, неловкое соглашение об именах). Это предотвращает транзакции только для чтения, но также и для функций записи, поэтому вам необходимо вручную обернуть эти функции в декораторе @commit_on_success.
В качестве альтернативы просто добавьте django.middleware.transaction.TransactionMiddleware в свои классы промежуточного ПО. Это приведет к завершению каждого запроса в транзакции. Это означает также излишнюю упаковку запросов на чтение только в транзакции, но это быстрое и грязное решение.