Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在development Django中为更新选择\u_Django_Transactions_Locking_Pessimistic Locking - Fatal编程技术网

在development Django中为更新选择\u

在development Django中为更新选择\u,django,transactions,locking,pessimistic-locking,Django,Transactions,Locking,Pessimistic Locking,缔约国指出: 如果您依赖“自动事务”来提供锁定 在为_update()选择_和后续写入操作之间- 非常脆弱的设计,但仍然有可能-您必须包装 原子()中的相关代码 这不再有效的原因是自动提交是在数据库层而不是应用层完成的吗?交易前: Django的默认行为是运行一个打开的事务,当任何内置的、改变数据的模型出现时,它会自动提交该事务 函数被调用 由于Django 1.6在数据库层使用了AUTCOMIT,因此选择\u进行\u更新之后,例如写入实际上会在两个事务中运行吗?如果是这种情况,那么,selec

缔约国指出:

如果您依赖“自动事务”来提供锁定 在为_update()选择_和后续写入操作之间- 非常脆弱的设计,但仍然有可能-您必须包装 原子()中的相关代码

这不再有效的原因是自动提交是在数据库层而不是应用层完成的吗?交易前:

Django的默认行为是运行一个打开的事务,当任何内置的、改变数据的模型出现时,它会自动提交该事务 函数被调用


由于Django 1.6在数据库层使用了AUTCOMIT,因此
选择\u进行\u更新
之后,例如
写入
实际上会在两个事务中运行吗?如果是这种情况,那么,
select\u for\u update
不会像它的要点那样变得无用吗?

select\u for\u update
只会在单个事务的上下文中锁定所选行。如果您使用的是autocommit,它不会做您认为它会做的事情,因为每个查询实际上都是它自己的事务(包括
SELECT…FOR UPDATE
query)。将您的视图(或其他函数)包装在
transaction.atomic
中,它将完全完成您希望它完成的操作。

这就是我认为文档中所说的,但是如果这是真的,那么select\u for\u update函数不是变得毫无用处了吗(其原始原因是在执行写入操作之前锁定受影响的行)@Taras-
select\u for\u update
的操作与文档中描述的完全一样,但是如果您将其与自动提交一起使用,则实际上是一次获取并释放锁,这没有多大帮助。因此,查询操作完全相同,但没有事务来维护某种状态,Postgres如何知道何时释放锁(即时除外)?如果它只是将它们保留到写入,那么想象一下,一个糟糕的程序选择了一堆行进行更新,然后引发了一个异常。所选行将永远被锁定。我想我现在明白了。
select\u for\u update
对自动提交不有用,但它在不使用自动提交行为时很有用,例如:当文档是通过一个“<代码>原子< /COD>语句……?为什么?文档为什么认为这是一个极其脆弱的设计?好像在一个后续的写操作中包装SypTyfFuxEngress是使SealtTyFuxUpUX有价值的唯一原因。否则,为什么还要费心呢?”在数据库层的自动提交中,django是1.6,而不是1.5。@fabspro谢谢-更正