Oke, saya pikir saya sudah memikirkan ini. Masalahnya terletak pada masalah lama dengan Django dan Psycopg2. Pada dasarnya, Psycopg2 akan secara otomatis mengeluarkan pernyataan BEGIN ke DB. Namun, jika Django berpikir tidak ada modifikasi data yang terjadi, itu tidak akan mengeluarkan COMMIT di akhir transaksi.
Ada beberapa solusi untuk masalah ini, lihat http://www. slideshare.net/OReillyOSCON/unbreaking-your-django-application untuk lebih jelasnya. Idealnya Anda mematikan komit otomatis (dengan mengatur autocommit =True dalam pengaturan DB Anda, konvensi penamaan yang canggung). Ini mencegah transaksi pada fungsi hanya-baca, tetapi juga pada fungsi tulis sehingga Anda perlu membungkus fungsi tersebut secara manual dalam dekorator @commit_on_success.
Atau, tambahkan saja django.middleware.transaction.TransactionMiddleware ke kelas Middleware Anda. Ini akan membungkus setiap permintaan dalam suatu transaksi. Ini berarti juga tidak perlu membungkus permintaan hanya-baca dalam suatu transaksi, tetapi ini adalah solusi cepat dan kotor.