在开发Django中select_for_update

时间:2013-06-17 14:07:11

标签: django transactions locking pessimistic-locking

Django documentation表示:

  

如果您依靠“自动交易”来提供锁定   在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}}变得无用了?

1 个答案:

答案 0 :(得分:5)

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