Ok, jag tror jag har kommit på det här. Problemet ligger i ett långvarigt problem med Django och Psycopg2. I grund och botten kommer Psycopg2 automatiskt att utfärda en BEGIN-sats till DB. Men om Django tror att ingen dataändring har skett, kommer den inte att utfärda ett COMMIT i slutet av en transaktion.
Det finns några lösningar på detta problem, titta på http://www. slideshare.net/OReillyOSCON/unbreaking-your-django-application för mer detaljer. Helst stänger du av automatiska commits (genom att ställa in autocommit =True i dina DB-inställningar, besvärlig namnkonvention). Detta förhindrar transaktioner på skrivskyddade funktioner, men också på skrivfunktioner, så du måste manuellt slå in dessa funktioner i en @commit_on_success-dekorator.
Alternativt kan du bara lägga till django.middleware.transaction.TransactionMiddleware till dina Middleware-klasser. Detta kommer att avsluta varje begäran i en transaktion. Detta innebär också att man i onödan slår in skrivskyddade förfrågningar i en transaktion, men det är en snabb och smutsig lösning.