在开发Django中select_for_update

Tre*_*ent 7 django locking transactions pessimistic-locking

Django文档指出:

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

这不再有效的原因是自动提交是在数据库层而不是应用层完成的吗?以前,在调用数据更改函数之前,事务将保持打开状态:

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

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

oro*_*aki 7

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

  • @Taras - `select_for_update`完全按照记录的方式执行,但如果你将它与自动提交一起使用,你实际上是在同时获取和释放锁定,这没有多大帮助.因此,查询操作完全相同,但没有事务来维持某种状态,Postgres如何知道何时释放锁(除了立即)?如果它只是持有它们直到写入,想象一个错误的程序选择了一堆行进行更新,然后引发异常.选定的行将永久锁定. (2认同)