Python django 1.5为被视为脆弱设计的更新选择

Python django 1.5为被视为脆弱设计的更新选择,python,django,django-database,Python,Django,Django Database,美国 如果您依赖“自动事务”来提供锁定 在为\u更新选择\u和后续写入操作之间- 非常脆弱的设计,但仍然有可能-您必须包装 原子计算机中的相关代码。自Django 1.6.3以来,使用 为自动提交模式下的更新选择\u将引发 TransactionManagementError 为什么这被认为是脆弱的?我本以为这会导致适当的交易性。答案就在眼前,在我的文档中: 在自动提交模式下使用select_for_update对查询集进行求值是一个重要步骤 错误,因为行未被锁定。如果允许的话,这将 有助于数据

美国

如果您依赖“自动事务”来提供锁定 在为\u更新选择\u和后续写入操作之间- 非常脆弱的设计,但仍然有可能-您必须包装 原子计算机中的相关代码。自Django 1.6.3以来,使用 为自动提交模式下的更新选择\u将引发 TransactionManagementError


为什么这被认为是脆弱的?我本以为这会导致适当的交易性。

答案就在眼前,在我的文档中:

在自动提交模式下使用select_for_update对查询集进行求值是一个重要步骤 错误,因为行未被锁定。如果允许的话,这将 有助于数据损坏,并且很容易由调用, 在任何事务之外,期望在一个事务中运行的代码

换句话说,autocommit和select_for_update之间存在矛盾行为,这可能导致数据损坏。这里是他们第一次提出解决这个问题的地方,再次引用,强调我的观点:

[…]在Oracle下,在自动提交模式下,会发生自动提交 在命令执行后立即执行-因此,尝试获取 如果在单独的事务中完成,结果将失败

但是,对于任何后端,请在自动提交模式下选择更新 没有什么意义。即使它没有像穿衣服时那样坏 甲骨文,它并没有真正锁定任何东西。所以,国际海事组织,执行 在自动提交模式下选择更新的查询可能是en 错误,并且可能导致数据损坏错误

所以我建议我们改变select for update查询的行为, 若要出错[…],这是一个向后不兼容的更改[…] 这些项目可能应该心存感激——它们是以一种全新的方式运行的 现在暴露出来的细微缺陷——但仍然存在

所以这是一个Oracle特有的bug,它揭示了一个与所有后端相关的更深层次的问题,因此他们决定在django中将此作为一个错误

另一方面,Atomic只在验证没有错误后才将内容提交到数据库,从而解决了问题。

选择更新并不脆弱

我写道,如果您依赖自动事务,那么当您从1.6升级到1.5时,您需要检查代码

如果您不依赖自动事务,甚至如果这个概念没有敲响警钟,那么您就不需要做任何事情


正如尤维在回答中指出的,这是非常好的,谢谢!Django遇到无效代码时将引发异常。在您看到select_for_update引发的TransactionManagement错误之前,无需考虑此问题。

Aymeric在电子邮件中澄清,这样的设计是脆弱的,因为它依赖于Django 1.5的隐式事务形成的隐式事务边界

select_for_update(...)
more_code()
save()
此代码适用于简单的情况,但如果更多的_代码导致对数据库的写入操作,则事务将关闭,从而产生意外行为


强制用户指定事务边界也会使代码更清晰。

您所写的内容有意义,但文档的编写方式表明1.5中的设计很脆弱。如果您依赖于自动事务。。。。这对我来说就是说,在1.5中使用select_for_update来锁定行以进行更新是一种脆弱的设计,即使关闭了数据库自动提交,但仍然使用Django“autocommit”应用程序实现是的,你是对的,只有在使用autocommit时它才是脆弱的,因为它实际上并不锁定任何东西。一般来说,它并不易碎。请注意,这个错误解决了这个问题,因为它只在使用autocommit的select_for_update用法的特定情况下被激活,所以它完全有意义,因为“极其脆弱的设计”注释只适用于Django 1.6+?文档的编写方式意味着,对于Django<1.6,将考虑选择_进行更新fragile@Taras仅当与auotcommit一起使用时,select_for_更新本身并不脆弱。我不确定在Django“自动提交”应用程序实现中使用它会有什么影响。从技术上讲,由于有缺陷的设计错误出现在1.6版本中,那么是的,这主要是Django框架的核心开发人员fiesta早期发布的第一篇文章的问题!我只是想对你的贡献表示感谢。希望将来您还会发其他帖子:-