多个并发数据库事务与Django?

2024-10-06 09:43:53 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以在一个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来做这个呢?在


Tags: django函数objobjects进程defcreatewith
2条回答

您可能需要查看django'sdoc中的“savepoint”

我做了一个小测试(但没有交易,但我认为它可能有用)

我在django的设置中设置了2个dbs:

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上这样做了:

^{pr2}$

同时我在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             |
+   +   +        -+   +    -+   +   -+         +

所以我假设每个db都有一个事务(实际上是同一个db)。在

相关问题 更多 >