A context manager/decorator which extends Django's atomic function with the ability to set isolation level and retries for a given transaction.
Project description
django-pgtransaction
django-pgtransaction offers a drop-in replacement for the default django.db.transaction module which, when used on top of a PostgreSQL database, extends the functionality of that module with Postgres-specific features.
At present, django-pgtransaction offers an extension of the django.db.transaction.atomic context manager/decorator which allows one to dynamically set transaction characteristics including:
- Isolation level
- Read mode (READ WRITE/READ ONLY)
- Deferrability (DEFERRABLE/NOT DEFERRABLE)
- Retry policy for Postgres locking exceptions
See the quickstart below or the docs for examples.
Quickstart
After installation, set transaction characteristics using pgtransaction.atomic:
Isolation Levels
Set the isolation level for specific consistency guarantees:
import pgtransaction
with pgtransaction.atomic(isolation_level=pgtransaction.SERIALIZABLE):
# Do queries with SERIALIZABLE isolation...
There are three isolation levels: pgtransaction.READ_COMMITTED, pgtransaction.REPEATABLE_READ, and pgtransaction.SERIALIZABLE. By default it inherits the parent isolation level, which is Django's default of "READ COMMITTED".
Read-Only Transactions
Read-only mode can be used queries that don't modify data:
with pgtransaction.atomic(read_mode=pgtransaction.READ_ONLY):
# Can only read, not write
results = MyModel.objects.all()
Deferrable Transactions
Prevent serialization failures for long-running queries by blocking:
with pgtransaction.atomic(
isolation_level=pgtransaction.SERIALIZABLE,
read_mode=pgtransaction.READ_ONLY,
deferrable=pgtransaction.DEFERRABLE
):
# Long-running read-only query that won't cause serialization conflicts
analytics_data = expensive_query()
Note: DEFERRABLE only works with SERIALIZABLE isolation level and READ_ONLY mode.
Retries for Concurrent Updates
When using stricter isolation levels like pgtransaction.SERIALIZABLE, Postgres will throw serialization errors upon concurrent updates to rows. Use the retry argument with the decorator to retry these failures:
@pgtransaction.atomic(isolation_level=pgtransaction.SERIALIZABLE, retry=3)
def do_queries():
# Do queries...
Note that the retry argument will not work when used as a context manager. A RuntimeError will be thrown.
By default, retries are only performed when psycopg.errors.SerializationError or psycopg.errors.DeadlockDetected errors are raised. Configure retried psycopg errors with settings.PGTRANSACTION_RETRY_EXCEPTIONS. You can set a default retry amount with settings.PGTRANSACTION_RETRY.
Nested Usage
pgtransaction.atomic can be nested, but keep the following in mind:
- Isolation mode cannot be changed once a query has been performed.
- Read-write mode can not be changed to from within a read only block.
- The retry argument only works on the outermost invocation as a decorator, otherwise
RuntimeErroris raised.
Compatibility
django-pgtransaction is compatible with Python 3.10 - 3.14, Django 4.2 - 6.0, Psycopg 2 - 3, and Postgres 14 - 18.
Documentation
Check out the Postgres docs to learn about transaction isolation in Postgres.
View the django-pgtransaction docs here
Installation
Install django-pgtransaction with:
pip3 install django-pgtransaction
After this, add pgtransaction to the INSTALLED_APPS setting of your Django project.
Contributing Guide
For information on setting up django-pgtransaction for development and contributing changes, view CONTRIBUTING.md.
Creators
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django_pgtransaction-2.1.0.tar.gz.
File metadata
- Download URL: django_pgtransaction-2.1.0.tar.gz
- Upload date:
- Size: 7.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.2.1 CPython/3.14.0 Linux/6.8.0-1040-aws
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
405005611f02d610724e5a72d26f77ac2c5b250531eb766ffe5a7603bac0c769
|
|
| MD5 |
347d8259c692552f05380f14474a301f
|
|
| BLAKE2b-256 |
c6a21d27aaab82fa8342f9c8f90fec32b4595820478caa207ccf3abdcf635821
|
File details
Details for the file django_pgtransaction-2.1.0-py3-none-any.whl.
File metadata
- Download URL: django_pgtransaction-2.1.0-py3-none-any.whl
- Upload date:
- Size: 8.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.2.1 CPython/3.14.0 Linux/6.8.0-1040-aws
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
69b38505a4eac5df56a48045b9b6c7f8a4e2c34d50f55e89201cbef57d3a725b
|
|
| MD5 |
b9ce0b51a299864482dfb750517fdddd
|
|
| BLAKE2b-256 |
ab75f9d33972ddb859b210f017f0ce2b5e8904248e91e9ba2f4b71d395d9eac2
|