Django版本1.10.5与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()Passport模型在DB2模型中根本不存在。
我的路由器已经安装好了,所以所有的写操作都会转到每个受人尊敬的DB上。
那么,在原子事务中设置using='db1'的目的是什么?我已经查看了源代码,当不“使用”时,我看到它默认为default。
在上面的例子中,我甚至在初始事务中进行了另一个事务,但是这次using='db2'甚至不存在模型。我想这可能会失败,但它没有,数据被写入到适当的数据库中。
我之所以提到这一点,是因为在某些情况下,我需要与所有3个数据库进行交互,如果在向所有3个数据库写入时出现了单个问题,那么所有3个数据库都需要回滚,如果一切都成功的话,那么当然是提交。
也许有人能帮我分解一下这样我才能理解?
发布于 2017-01-26 06:20:21
https://stackoverflow.com/questions/41866795
复制相似问题