select_for_update(nowait=False)
返回一个 queryset ,会锁定相关行直到事务结束。在支持的数据库上面产生一个SELECT … FORUPDATE语句
例如:
entries = Entry.objects.select_for_update().filter(author=request.user)
所有匹配的行将被锁定,直到事务结束。这意味着可以通过锁防止数据被其它事务修改。
一般情况下如果其他事务锁定了相关行,那么本查询将被阻塞,直到锁被释放。如果这不是你想要的行为,请使用select_for_update(nowait=True). 这将使查询不阻塞。如果其它事务持有冲突的锁, 那么查询将引发 DatabaseError 异常.
目前,postgresql_psycopg2, oracle 和 mysql 数据库后端支持 select_for_update().但是 MySQL 不支持 nowait 参数。显然,用户应该检查后端的支持情况。
当在不支持nowait功能的数据库后端(例如 MySql) 使用nowait=True 参数调用 select_for_update() 时将引发 DatabaseError 异常. 这是防止意外造成代码被阻塞。
在自动提交模式下使用 select_for_update() 将引发 TransactionManagementError 异常,原因是自动提交模式下不支持锁定行。如果允许这个调用,那么可能造成数据损坏,而且这个功能很容易在事务外被调用。
对于不支持 SELECT … FORUPDATE的后端 (例如SQLite) select_for_update() 将没有效果。
Changed in Django 1.6.3:
在自动提交模式下,使用select_for_update()执行查询现在是一个错误。在1.6系列的早期版本中,它是一个无操作。
警告
Although select_for_update() normally fails in autocommit mode, since TestCase automatically wraps each test in a transaction, calling select_for_update() in a TestCase even outside an atomic() block will (perhaps unexpectedly) pass without raising a TransactionManagementError. 要正确测试select_for_update(),您应该使用TransactionTestCase。
更多内容学习:享学课堂 -享学社区
领取专属 10元无门槛券
私享最新 技术干货