多数据库事务

时间:2017-01-26 04:16:48

标签: django postgresql django-models transactions

Django Version 1.10.5 with Postgres 9.6.1

去年,我一直在多架构默认数据库环境中工作。然而,事情开始发展到我决定将单个数据库分成3个数据库的程度。

我已经为所有3个数据库使用主/从路由器。

我没有使用'默认'数据库密钥。相反,我有' db1',' db2'和' db3'

我感到困惑的部分是这个多数据库环境中的事务。

在此示例中,它按预期失败。当然是因为我没有使用@transaction.atomic(using='db1')这一点。

@transaction.atomic()
def edit(self, context):
    """Edit

    :param dict context: Context

    :return: None
    """

    # Check if employee exists
    try:
        result = Passport.objects.get(pk=self.user.employee_id)
    except Passport.DoesNotExist:
        return False

    result.name = context.get('name')

    result.save()

但是我有这个奇怪的例子,仅仅是因为我试图理解......我本以为这会失败,但事实并非如此:

@transaction.atomic(using='db1')
def edit(self, context):
    """Edit

    :param dict context: Context

    :return: None
    """

    # Check if employee exists
    try:
        result = Passport.objects.get(pk=self.user.employee_id)
    except Passport.DoesNotExist:
        return False

    result.name = context.get('name')

    with transaction.atomic(using='db2'):
        result.save()

DB2模型中根本不存在模型Passport

设置了我的路由器,以便所有写入都发送到每个受尊重的数据库。

那么在原子事务中设置using='db1'的目的是什么?我查看了源代码,我发现默认情况下default没有"使用"。

在上面的示例中,我甚至在初始事务中进行了另一个事务,但这次using='db2'模型甚至不存在。我想这会失败,但它没有,数据被写入适当的数据库。

我提出这个问题是因为在某些情况下我需要与所有3个数据库进行交互,如果在写入所有3个数据库时出现单个问题,则所有3个数据库都需要回滚,或者如果一切成功,则提交当然。

也许有人可以帮我解决这个问题,这样我才明白?

1 个答案:

答案 0 :(得分:1)

您将app.UseCors(builder => builder.WithOrigins("https://localhost:44306") .AllowAnyMethod() .WithHeaders("authorization", "accept", "content-type", "origin")); 解释为:在事务中的X上运行以下数据库命令。

实际上,它只是意味着:在数据库X上打开一个事务,然后提交它或在块的末尾回滚

或者,正如documentation所说:

  

在幕后,Django的交易管理代码:

     
      
  • 在进入最外面的原子块时打开一个事务;
  •   
  • 退出最外面的块时提交或回滚事务。
  •   

用于给定命令的数据库的问题由您的router确定,而不是transaction.atomic(using='X')子句。所以你的using块是没有意义的(它只会在transaction.atomic(using='db2')上打开一个事务,然后关闭它),但不是错误。