是否可以在一个 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 个数据库:
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 | +------+------+-----------------+------+---------+------+-------+------------------+
所以我想您将为每个数据库(实际上是同一个数据库)创建一个事务。
关于python - 与 Django 的多个并发数据库事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22518156/