享学课堂-django查询之select

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。

更多内容学习:享学课堂 -享学社区

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180502A09T0000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券