【问题标题】:In django's transaction, result of query won't change after update operation在django的事务中,更新操作后查询结果不会改变
【发布时间】:2016-02-12 09:46:18
【问题描述】:

我正在使用 Django1.8 和 mysql 数据库。数据库隔离级别是“可重复读取”。 我的代码如下:

@with transaction.atomic():
    SomeModel.objects.create(key='aaa') # insert record
    insertedRecord = SomeModel.objects.get(key='aaa') # try to fetch inserted record

我遇到的问题是,SomeModel.objects.get(key='aaa') 行会抛出一个DoesNotExist 异常,这意味着这个查询看不到之前创建操作所做的更改。

我错过了什么吗?

【问题讨论】:

  • 您可以使用insertedRecord = SomeModel.objects.create(key='aaa')
  • 谢谢。但我就是想不通为什么会这样?同样在实践中,原子块可以包含多个函数调用,create 的结果不会直接可用。
  • repeatable-read 保证相同的查询返回相同的结果,(我不确定在连接中还是在事务中是这样)。因此,在将行添加到事务或连接中的某处之前运行获取查询。
  • 我认为您显示的代码不足以重现您所看到的行为。

标签: python django django-models


【解决方案1】:

好的,经过一番挖掘,我想我终于得到了答案。 我们的项目使用主从数据库架构,读写操作通过 django 的 DATABSE_ROUTERS 设置路由到不同的数据库。所以在代码中:

@with transaction.atomic():
    SomeModel.objects.create(key='aaa') # insert record, used the master connection
    insertedRecord = SomeModel.objects.get(key='aaa') # fetch record, used the slave connection

上面的代码基本上等于打开两个连接,一个写记录,一个读记录。因此,除非写入事务首先完成,否则读取不会命中。

相反,这段代码将通过强制读取主记录来给我预期的结果:

@with transaction.atomic():
    SomeModel.objects.create(key='aaa') # insert record, used the master connection
    insertedRecord = SomeModel.objects.using('master').get(key='aaa') # fetch record, force using master connection. Say `master` is alias for master connection 

【讨论】:

    猜你喜欢
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    相关资源
    最近更新 更多