Ok, jeg tror jeg har fundet ud af det her. Problemet ligger i et langvarigt problem med Django og Psycopg2. Grundlæggende vil Psycopg2 automatisk udstede en BEGIN-erklæring til DB. Men hvis Django mener, at der ikke er sket nogen dataændring, udsteder den ikke en COMMIT ved afslutningen af en transaktion.
Der er et par løsninger på dette problem, se på http://www. slideshare.net/OReillyOSCON/unbreaking-your-django-application for flere detaljer. Ideelt set deaktiverer du automatiske commits (ved at indstille autocommit =True i dine DB-indstillinger, akavet navnekonvention). Dette forhindrer transaktioner på skrivebeskyttede funktioner, men også på skrivefunktioner, så du skal manuelt indpakke disse funktioner i en @commit_on_success-dekorator.
Alternativt kan du blot tilføje django.middleware.transaction.TransactionMiddleware til dine Middleware-klasser. Dette vil omslutte hver anmodning i en transaktion. Dette betyder også unødigt at pakke skrivebeskyttede anmodninger ind i en transaktion, men det er en hurtig og beskidt løsning.