Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django中执行表/行锁定_Python_Mysql_Django_Locking - Fatal编程技术网

Python 如何在Django中执行表/行锁定

Python 如何在Django中执行表/行锁定,python,mysql,django,locking,Python,Mysql,Django,Locking,在Django在Apache上运行或与多个Gunicorn Worker一起运行的生产环境中,它存在并发问题的风险 因此,我非常惊讶地发现Django的ORM没有显式地支持表/行锁定。它非常方便地支持事务,但这只解决了并发问题的一半 对于MySQL后端,在Django中执行锁定的正确方法是什么?或者Django的框架中还有其他东西使它们变得不必要吗?Django没有明确提供执行表锁定的API。根据我的经验,设计良好的代码很少需要锁定整个表,大多数并发问题都可以通过行级锁定来解决。这是最后的努力:

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

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


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

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;")

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

确保您有一个支持事务的后端,然后您需要禁用AutoTebug(),然后确保您的代码在您认为是事务的末尾发出适当的提交或回滚语句。 上述参考文件中有一两个示例


这样做需要更多的工作和考虑,但可以为您提供事务

谢谢!抱歉,我实际上没有意识到我一直在说“表锁”,我更多的是指一般意义上的锁,比如行锁。在这个特定的例子中,行锁实际上是我想要的,因为正如您所提到的,表锁非常昂贵。@LukeSapan在这种情况下,您应该了解隔离级别。在大多数隔离级别中,事务中的write语句会自动获取一个
write
锁,直到事务结束。对于先选择,然后根据所选行执行一次或多次写入的情况,如何处理?@LukeSapan您通常可以重写这些语句,以从写查询开始。如果没有,你可以用。哇,真不敢相信我错过了。谢谢