Skip to main content
tests Test coverage status Current version on PyPi monthly downloads PyPI - Python Version PyPI - Django Version

Distributed locks for Django using DB (MySQL/Postgres)

Given the limitation that Percona Cluster does not support MySQL locks, this app implements locks using select_for_update() (row locks).

Installation

pip install django-database-locks

Usage

django-database-locks exposes one single the lock contextmanager and the locked decorator.

The locked decorator will wrap a django management command (subclasses of django.core.management.base.BaseCommand) or any function with the lock contextmanager:

from django.core.management.base import BaseCommand

from database_locks import locked

@locked
class Command(BaseCommand):
    ...
    def handle(self, *args, **options):
        self.stdout.write('Got the lock')
from database_locks import locked

class SomeClass:
  def non_locked(self):
    pass

  @locked
  def locked(self):
    print('got lock')
from database_locks import lock

class SomeClass:
  def non_locked(self):
    pass

  def locked(self):
    with lock():
        print('got lock')

Docs

Both lock and locked have the same optional args:

:param lock_name: unique name in DB for this function
:param timeout: numbers of seconds to wait to acquire lock
:param lock_ttl: expiration timer of the lock, in seconds (set to None to infinite)
:param locked_by: owner id for the lock (if lock is active but owner is the same, returns acquired)
:param auto_renew: if set to True will re-acquire lock (for `lock_ttl` seconds) before `lock_ttl` is over.
                   auto_renew thread will raise KeyboardInterrupt on the main thread in case re-acquiring fails
:param retry: retry every `retry` seconds acquiring until successful. set to None or 0 to disable.
:param lost_lock_cb: callback function when lock is lost (when re-acquiring). defaults to raising LockException

There are also the following options you can specify in the project settings.py

  • DATABASE_LOCKS_STATUS_FILE: file that will be updated with the lock status (default None). Useful when you have multiple shared-lock processes, to quickly inspect which one has the lock.

  • DATABASE_LOCKS_ENABLED: set to False to globally disable locks (default True)

  • DATABASE_LOCKS_DEFAULT_TTL: global lock TTL value (default 10) which is ignored when lock_ttl is specified

  • DATABASE_LOCKS_DEFAULT_TTL_RENEW: number of seconds to renew lock before TTL expires (default 2)

Testing

Tox is used by the Github Action to test several python and django versions, with both MySQL and Postgres.

To quickly test locally, kick off a MySQL and/or Postgres docker container:

docker run -d –name locks-test

-p 8877:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7

docker run -d –name locks-test-psql

-p 8878:5432 -e POSTGRES_PASSWORD=postgres postgres:10

List available environments with tox -l and then run the one you want/have:

tox -e py39-dj32-mysql # or tox -e py39-dj32-postgresql -e py39-dj32-mysql

Metadata

Release files for django-database-locks 0.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-database-locks 0.5
File Size Uploaded
django-database-locks-0.5.tar.gz 8.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-database-locks 0.5
File Interpreter ABI Platform
django_database_locks-0.5-py3-none-any.whl Python 3 none any Details

Total release size: 16.9 kB

Release files / django-database-locks-0.5.tar.gz

Download URL django-database-locks-0.5.tar.gz
Size 8.4 kB
Tags Source
SHA-256 checksum
How to use checksums
97666ffcccdc7377639948d1f5f0dc63590a1313fc7848c5b080c97d2a68591a
BLAKE2b-256 checksum
How to use checksums
aa8e44674c520b34d225f9d1edbfe56662c3109aaf49f53df32f697629aac425
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.5

Release files / django_database_locks-0.5-py3-none-any.whl

Download URL django_database_locks-0.5-py3-none-any.whl
Size 8.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1b88921becef07732c4992bac8ea5b4b514688da02c26805e8b9bf08be1b0ef2
BLAKE2b-256 checksum
How to use checksums
1588e8f0317239f836c383fe0209a671e7ff7078db715cf68ffc77516bac65fa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.5

Release history Release notifications | RSS feed

This release

0.5 This release

2 release files

0.3

2 release files

0.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page