Django中如何实现多个并发数据库事务?

7

在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个回答

7

我做了一个小测试(但没有事务,但我认为它可能有效)

我在Django的设置中设置了2个数据库:

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 shell中执行了以下操作:

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             |
+------+------+-----------------+------+---------+------+-------+------------------+
因此,我认为每个数据库都需要一个事务(实际上它们是同一个数据库)。

-1
您可能需要在Django文档中查看“保存点(savepoint)”。

保存点仅适用于一个主事务内的子事务。我想要两个不同的事务。 - David Wolever

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接