0

我正在通过一段遗留代码(Python2.6 和 Django1.3.3)来获取锁。后端是甲骨文。

参考引用的代码块。第 8 行需要 len(query set) 是什么?由于第 7 行的注释,我特别困惑。这一行在遍历查询集中的大量记录时非常耗时。我想知道在删除它之前有这条线的原因。

我将测试此代码并在此处更新。我将尝试不使用此行,并尝试将 len 替换为 .count() 方法。

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)
4

1 回答 1

0

avail_emp将包含一个查询对象,但 django 中的查询是“惰性”迭代器,这意味着它们在请求值之前不会真正运行。为了真正select_for_update()像 SQL 一样执行,需要对查询进行评估,但我们不关心查询的结果,只关心锁定行为。请求迭代器的 len() 足以触发查询的评估。由于我们不关心获取结果,这(也许)阻止了将对象获取到内存中。

或者,我们可以获取对象以获得相同的效果:

log.debug(list(avail_emp))
于 2019-06-18T00:56:42.283 回答