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个数据库都需要回滚,或者如果一切成功,则提交当然。
也许有人可以帮我解决这个问题,这样我才明白?
答案 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')
上打开一个事务,然后关闭它),但不是错误。