Python 使用Django的多个并发数据库事务?
是否可以在一个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
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)。保存点仅用于一个主事务中的子事务。我想要两个不同的交易。