我正在遍历一段旧代码(Python2.6和Django1.3.3)来获取锁。后端是Oracle。
请引用引用的代码块。第8行的len(查询集)有什么需要?由于第7行中的注释,我尤其感到困惑。这条特殊的行在遍历查询集中的大量记录时会浪费时间。我想知道删除该行之前的原因。
我将测试此代码并在此处更新。我将尝试不使用此行,并尝试用.count()方法替换len。
lock_acquired = False
while not lock_acquired:
try:
where_clause= "is_deleted=0"
avail_emp = Employee.objects.select_for_update(nowait=True).extra(where=[where_clause])
log.debug("Acquiring lock")
# *****Please dont remove below log to handle multiple requests at a time while rows are locked by a request*****
log.debug(len(avail_emp))
lock_acquired = True
log.debug("Lock acquired")
except Exception, e:
log.debug("%s - Waiting for 2 secs before retry " %str(e))
sleep(2)
答案 0 :(得分:0)
avail_emp
将包含一个查询对象,但是django中的查询是“惰性”迭代器,这意味着直到请求该值时它们才真正运行。为了实际上使select_for_update()
作为SQL执行,需要对查询进行评估,但是我们不关心查询的结果,仅关心锁定行为。要求迭代器的len()足以触发查询评估。由于我们不在乎获取结果,因此(也许)可以防止将对象获取到内存中。
或者,我们可以获取对象以获得相同的效果:
log.debug(list(avail_emp))