Django中加表锁

一:定义model时改写objects

from django.db import connection
from django.db import models


class LockingManager(models.Manager):
    """ Add lock/unlock functionality to manager.

    Example:
        定义model:
            class User(models.Model):
                name = models.CharField(max_length=32)
                objects = LockingManager()

        加表锁:
            User.objects.lock()
        解表锁:
            User.objects.unlock()

    """

    def lock(self):
        """ Lock table.

        Locks the object model table so that atomic update is possible.
        Simulatenous database access request pend until the lock is unlock()'ed.

        Note: If you need to lock multiple tables, you need to do lock them
        all in one SQL clause and this function is not enough. To avoid
        dead lock, all tables must be locked in the same order.

        See http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html
        """

        cursor = connection.cursor()
        table = self.model._meta.db_table
        print("Locking table %s" % table)
        cursor.execute("LOCK TABLES %s WRITE" % table)
        row = cursor.fetchone()
        return row

    def unlock(self):
        """ Unlock the table. """
        cursor = connection.cursor()
        table = self.model._meta.db_table
        cursor.execute("UNLOCK TABLES")
        row = cursor.fetchone()
        return row


class User(models.Model):
    name = models.CharField(max_length=32)
    objects = LockingManager()

二:使用表锁、释放表锁

import os
import django

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_table_lock.settings")
django.setup()

from app01 import models

import time

# 加表锁
models.User.objects.lock()
time.sleep(10)
# 释放锁
models.User.objects.unlock()

  

 

posted @ 2021-03-28 22:04  maple-shaw  阅读(563)  评论(0编辑  收藏  举报