gpt4 book ai didi

django - 多数据库事务

转载 作者:行者123 更新时间:2023-11-29 11:47:04 24 4
gpt4 key购买 nike

带有 Postgres 9.6.1 的 Django 版本 1.10.5

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

我已经为所有 3 个数据库配备了主/从路由器。

我没有使用“默认”数据库 key 。相反,我有“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 个数据库,或者如果一切都成功,则提交当然。

也许有人可以帮我分解一下以便我理解?

最佳答案

您将 transaction.atomic(using='X') 解释为:在 X 上的事务内运行以下数据库命令

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

或者,作为 documentation说:

Under the hood, Django’s transaction management code:

  • opens a transaction when entering the outermost atomic block;
  • commits or rolls back the transaction when exiting the outermost block.

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

关于django - 多数据库事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41866795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com