Opened 5 years ago

Closed 4 years ago

#18130 closed New feature (fixed)

postgres_psycopg2 adapter should not use hard coded isolation levels

Reported by: limscoder Owned by: nobody
Component: Database layer (models, ORM) Version: 1.4
Severity: Normal Keywords: postgres
Cc: niwi@… Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no


Django's postgres_psycopg2 adapter sets the connection's isolation level to psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED when autocommit == False.

My application requires a more strict isolation level, so I am forced to create a new backend and override DatabaseWrapper._set_isolation_level to make sure the connection has the correct isolation level set.

There should be a configuration option within the database config in that allows users to set the appropriate isolation level if the default level is not correct for their application. It would also be nice if there was an option to not set the isolation level at all, and instead rely on the default isolation level provided by the Postgres server.

Change History (5)

comment:1 Changed 5 years ago by limscoder

Summary: postgres_psycopg2 adapter uses hard coded isolation levelspostgres_psycopg2 adapter should not use hard coded isolation levels

comment:2 Changed 4 years ago by Andrei Antoukh

Cc: niwi@… added
Has patch: set

Here the patch to allow to define the default isolation_level parameter on database configuracion dict:

I run the tests (not all tests) and I have not seen any fail that might be related.

Last edited 4 years ago by Andrei Antoukh (previous) (diff)

comment:3 Changed 4 years ago by Aymeric Augustin

Triage Stage: UnreviewedAccepted

Yes, we could provide a way to switch to "serializable" for people with high concurrency and integrity requirements.

IIRC, under the "serializable" isolation level, the application should be prepared to handle transaction failures (and possibly retry) on every database query. I'm not sure we can handle this automatically in Django without introducing magic. It deserves a fat warning in the documentation. This isolation level is for people who know what they're doing :)

NB: there is some material on this topic in #3460.

comment:4 Changed 4 years ago by Andrei Antoukh

I think, does not need any kind of magic by django, as you say: "This isolation level is for people who know what they're doing."

I now update the patch with some checks for isolation_level value and documentation notes with warning.

comment:5 Changed 4 years ago by Aymeric Augustin <aymeric.augustin@…>

Resolution: fixed
Status: newclosed

In e0449316ebacaa550e9c529f8c9cb9a9b44e3765:

Fixed #18130 -- Made the isolation level configurable on PostgreSQL.

Thanks limscoder for the report and niwi for the draft patch.

Note: See TracTickets for help on using tickets.
Back to Top