Django中如何处理多个并发数据库事务?
在一个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 | +------+------+-----------------+------+---------+------+-------+------------------+
所以我猜每个数据库都会有一个事务(其实它们是同一个数据库)。