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

标签 python django django-orm

是否可以在一个 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/

相关文章:

python - Django channel websocket.receive 未处理

html - VSCode Formatter 在我的 django 项目上导致错误

python - Django 服务器 100% cpu 无明显原因

python - 在列表的列表中操作字符串

python - 为什么 Selenium 的响应没有 sessionId?

python - Django - 在单个查询中获取外键对象?

python - Django 按计算值排序

python - Django ORM 左连接与 GROUP BY 和 SUM

django - 通过 Django 上的一个 SQL 请求列出用户及其上一篇文章

python - 使用线程时 Pyqt5 GUI 仍然挂起