如何在Django中执行表/行锁

问题描述 投票:5回答:2

在Django在Apache上运行或与多个Gunicorn工作器一起运行的生产环境中,它存在并发问题的风险。

因此,我很惊讶地发现Django的ORM没有明确支持表/行锁定。它非常支持事务,但这只解决了一半的并发问题。

使用MySQL后端,在Django中执行锁定的正确方法是什么?或者在Django的框架中还有其他什么东西可以使它们变得不必要吗?

python mysql django locking
2个回答
12
投票

Django没有明确提供API来执行表锁定。根据我的经验,精心设计的代码很少需要锁定整个表,并且大多数并发问题可以通过行级锁定来解决。这是最后的努力:它不能解决并发问题,它只会杀死任何并发尝试。

如果您确实需要表级锁定,则可以使用游标并执行原始SQL语句:

from django.db import connection

with connection.cursor() as cursor:
    cursor.execute("LOCK TABLES %s READ", [tablename])
    try:
        ...
    finally:
        cursor.execute("UNLOCK TABLES;")

0
投票

考虑将事务隔离级别设置为可序列化,并使用支持事务的MySQL表类型(MyISAM不支持,InnoDB。)

在确保您拥有支持事务的后端之后,您需要禁用自动提交(https://docs.djangoproject.com/en/1.8/topics/db/transactions/#autocommit-details),然后确保您的代码在您认为是事务的末尾发出相应的提交或回滚语句。

上面引用的文档中有一个或两个示例..

这样做需要更多的工作和考虑,但为您提供交易。

© www.soinside.com 2019 - 2024. All rights reserved.