首页
学习
活动
专区
圈层
工具
发布

多DB事务
EN

Stack Overflow用户
提问于 2017-01-26 04:16:47
回答 1查看 1.5K关注 0票数 4

Django版本1.10.5与Postgres 9.6.1

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

我已经完成了所有3个数据库的主/从路由器的工作。

我没有使用‘默认’数据库键。相反,我有“DB1”、“DB2”和“db3”

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

在本例中,它按预期失败。当然是不使用@transaction.atomic(using='db1')造成的,这对我来说是很清楚的。

代码语言:javascript
复制
@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()

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

代码语言:javascript
复制
@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个数据库都需要回滚,如果一切都成功的话,那么当然是提交。

也许有人能帮我分解一下这样我才能理解?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-26 06:20:21

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

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

或者,正如文档所说:

在幕后,Django的事务管理代码:

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41866795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档