Django中如何处理多个并发数据库事务?

8 投票
2 回答
1991 浏览
提问于 2025-04-17 23:02

在一个Django进程中,能否同时使用多个并发事务呢?

具体来说,我有两个函数,它们应该可以同时执行(相互之间可以交替),但每个函数都应该在自己的事务中运行。例如:

def process_things(callback, things):
    with start_transaction():
        for thing in things:
            obj = Thing.objects.create(…)
            callback(obj)

def callback(obj):
    with start_separate_transaction():
        …
        ThingProcessingLog.objects.create(…)

我希望每个函数都能在独立的数据库事务中操作,这样在这个例子中,ThingProcessingLog 记录会立即创建并可见,但 Thing 对象在全部处理完成之前是看不到的。

我该如何使用Django的ORM来实现这个呢?

2 个回答

-1

你可能需要看看Django文档里的“保存点(savepoint)”部分,链接在这里:django'sdoc

8

我做了一个小测试(虽然没有进行实际的事务,但我觉得可能是有效的)

我在Django的设置里配置了两个数据库:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'mydb',
        'PASSWORD': 'mydb',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    },
    'alias': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'mydb',
        'PASSWORD': 'mydb',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

然后我在Django的命令行界面里执行了这个:

Table1.objects.using('default').all()
Table1.objects.using('alias').all()

Table2.objects.using('default').all()
Table2.objects.using('alias').all()

与此同时,我在MySQL里做了这个操作:

mysql> show processlist;
+------+------+-----------------+------+---------+------+-------+------------------+
| Id   | User |     Host        | db   | Command | Time | State | Info             |
+------+------+-----------------+------+---------+------+-------+------------------+
| 1314 | mydb | localhost:40224 | mydb | Query   |    0 | NULL  | show processlist |
| 1315 | mydb | localhost:40225 | mydb | Sleep   |    5 |       | NULL             |
| 1316 | mydb | localhost:40226 | mydb | Sleep   |    5 |       | NULL             |
+------+------+-----------------+------+---------+------+-------+------------------+

所以我猜每个数据库都会有一个事务(其实它们是同一个数据库)。

撰写回答