8

Django 文档指出:

如果您依靠“自动事务”在 select_for_update() 和后续写入操作之间提供锁定——这是一个极其脆弱的设计,但仍然可能——你必须将相关代码包装在 atomic() 中。

这不再起作用的原因是自动提交是在数据库层而不是应用程序层完成的吗?以前,事务将保持打开状态,直到调用数据更改函数

Django 的默认行为是使用打开的事务运行,当调用任何内置的数据更改模型函数时,它会自动提交该事务

从 Django 1.6 开始,在数据库层使用 autcommit,aselect_for_update后跟例如 awrite实际上会在两个事务中运行?如果是这种情况,那么它并没有select_for_update变得无用,因为它的重点是锁定行直到调用数据更改函数

4

1 回答 1

9

select_for_update只会在单个事务的上下文中锁定选定的行。如果您使用自动提交,它不会像您认为的那样做,因为每个查询实际上都是它自己的事务(包括SELECT ... FOR UPDATE查询)。将您的视图(或其他功能)包裹起来transaction.atomic,它会完全按照您的期望执行。

于 2013-06-17T14:16:03.550 回答