【问题标题】:Multiple concurrent database transactions with Django?使用 Django 的多个并发数据库事务?
【发布时间】:2014-04-26 10:10:03
【问题描述】:

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

【问题讨论】:

    标签: python django django-orm


    【解决方案1】:

    我做了一个小测试(但没有交易,但我认为它可能会起作用)

    我在 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> 显示进程列表; +------+------+------+------+---------+ ------+--------+------+ |身份证 |用户 |主持人 |分贝 |命令 |时间 |状态 |信息 | +------+------+------+------+---------+ ------+--------+------+ |第1314章数据库 |本地主机:40224 |数据库 |查询 | 0 |空 |显示进程列表 | | 1315 |数据库 |本地主机:40225 |数据库 |睡眠 | 5 | |空 | | 1316 |数据库 |本地主机:40226 |数据库 |睡眠 | 5 | |空 | +------+------+------+------+---------+ ------+--------+------+

    所以我想你将为每个数据库(实际上是同一个数据库)进行一个事务。

    【讨论】:

      【解决方案2】:

      您可能需要查看django'sdoc 中的“保存点”

      【讨论】:

      • 保存点仅适用于一个主要交易中的子交易。我想要两个不同的交易。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 2011-12-29
      • 2022-01-23
      相关资源
      最近更新 更多