Django 事务锁定表

4 投票
1 回答
2841 浏览
提问于 2025-04-16 09:50

我需要更新、添加和删除用户表(auth.models.User)中的行,但不幸的是……

当我这样做的时候,表就被锁住了,我无法对这个表执行任何查询。


我在这些查询周围使用了 @transaction.commit_manually,这可能和表被锁有关。

这个事务看起来像这样:

for row in csv_reader:

    update_sql = "UPDATE auth_user SET last_name = '%s' WHERE username = '%s'" %(row[2], row[0] )
    cursor.execute(update_sql)
    if not index % 100: print index:
        print index
        transaction.commit()

另外,我使用的是 Sql Server 2008,我想知道这是否是Sql Server特有的问题,还是在PostgreSQL和MySQL中也会出现这样的表锁情况。


大家有什么想法吗? :)

1 个回答

2

是的,你确实是故意锁定了表。我建议你了解一下事务隔离,因为这是数据库的一个核心概念。

关于你的问题,你可以尝试几种方法来处理UPDATE和SELECT语句:

  • 你可以设置事务隔离级别,把它调低,这样在整个数据库连接中都能使用。
  • 你可能也可以用其他机制来做到这一点。
  • 你可以尝试调整你的查询顺序,先读取基础数据,然后再开始修改数据。这样可能会让你锁定表,但仍然可以继续操作。
  • 你也可以再考虑一下哪些查询需要以事务的方式处理。
  • 你还可以通过锁定提示来指导SQL Server。

撰写回答