如果您依靠“自动交易”来提供锁定 在select_for_update()和后续的写操作之间 - 一个 极其脆弱的设计,但仍然可能 - 你必须包装 atomic()中的相关代码。
这不再起作用的原因是自动提交是在数据库层而不是应用程序层完成的吗?以前是交易would be held open until a data-altering function is called:
Django的默认行为是运行一个打开的事务,当任何内置的数据更改模型时它会自动提交 函数被称为
从Django 1.6开始,在数据库层使用autcommit,select_for_update
后跟例如write
实际上会在两个事务中运行吗?如果是这种情况,那么select_for_update
是不是{{1}}变得无用了?
答案 0 :(得分:5)
select_for_update
只会在单个事务的上下文中锁定所选行。如果您使用自动提交,它将不会按照您的想法执行,因为每个查询实际上都是自己的事务(包括SELECT ... FOR UPDATE
查询)。在transaction.atomic
中包含您的观点(或其他功能),它将完全按照您的期望去做。