Python 使用Django的多个并发数据库事务?

Python 使用Django的多个并发数据库事务?,python,django,django-orm,Python,Django,Django Orm,是否可以在一个Django进程中使用多个并发事务 具体地说,我有两个函数,每个函数都应该并发执行(相互让步),但每个函数都应该在自己的事务中。例如: def process_things(callback, things): with start_transaction(): for thing in things: obj = Thing.objects.create(…) callback(obj) def callb

是否可以在一个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实现这一点?

您可能需要在中查看“保存点”

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

我在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中我做到了:

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 | +------+------+-----------------+------+---------+------+-------+------------------+ mysql>显示进程列表; +------+------+-----------------+------+---------+------+-------+------------------+ |Id |用户|主机| db |命令|时间|状态|信息| +------+------+-----------------+------+---------+------+-------+------------------+ |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)。

保存点仅用于一个主事务中的子事务。我想要两个不同的交易。