mysql - 在 Django 程序中的数百个 MySQL UPDATE 语句期间禁用自动提交

标签 mysql django transactions indexing autocommit

在 Django 程序中,如何在数百个 UPDATE 之前显式禁用自动事务管理并在 UPDATE 完成后启用它?

我调查了 http://docs.djangoproject.com/en/dev/topics/db/transactions/但没有找到任何线索。

我试着把下面的代码放在开头

settings.DISABLE_TRANSACTION_MANAGEMENT = True

我也试过

cursor = connection.cursor()
cursor.execute('SET SESSION autocommit = 0;')
...
UPDATE
...
cursor.execute('SET SESSION autocommit = 1;')

以上两种方法都没有提高更新速度。上面的代码有什么问题吗?

最佳答案

from django.db import transaction

@transaction.commit_on_success
def my_function_that_does_thousands_of_updates():

    # Do whatever you want here
    transaction.set_dirty()

这将使您可以运行任何您想运行的 SQL,然后仅在没有异常时才提交。如果您像示例中那样使用手动游标,则需要 set_dirty() 调用,但如果您只使用 Django ORM 则不需要调用(如果我没记错的话;这至少是 1.2 行为)。

要完全控制交易,您可以使用 transaction.commit_manually 装饰器。至于你的速度问题,我无法评论。

django 文档很好地解释了这一点:http://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.commit_on_success

关于mysql - 在 Django 程序中的数百个 MySQL UPDATE 语句期间禁用自动提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3656397/

相关文章:

MySQL移动平均线计算使用CASE

mysql.h : No such file or directory

python - django inspectdb utf8mb4 错误

django - 从 Django 调用数据库函数的正确方法?

python - Django 多重继承与不同的表

python - 如何从 HTML 获取 Python 数组的第一个元素

jakarta-ee - BMT/CMT 和应用程序/容器管理的 EntityManager 之间有什么关系?

html - 我打印 MySQL 数据的 CGI 脚本有什么问题?

database - 如何在 Erlang 中更新 Mnesia 表

concurrency - 乐观并发控制中的后向/前向验证