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变得无用,因为它的意思是锁定行直到调用数据更改函数?
select_for_update只会在单个事务的上下文中锁定所选行.如果您使用自动提交,它将不会按照您的想法执行,因为每个查询实际上都是自己的事务(包括SELECT ... FOR UPDATE查询).包含您的视图(或其他功能)transaction.atomic,它将完全按照您的期望去做.