我可以避免在Django中锁定行不必要的时间吗



以以下代码为例(忽略其功能的不足,因为它只是一个包含我需要的东西的简单示例):

@transaction.commit_on_success
def test_for_success(username)
    person = Person.objects.select_for_update().get(username=username)
    response = urllib2.urlopen(URL_TO_SOME_SLOW_API, some_data)
    if '<YES>' in response.read():
        person.successes += 1
        person.save()

我的问题与有关,查询何时到达数据库。很明显,第一个查询将锁定Person行,然后我调用一个缓慢的API,这可能需要3秒钟的响应时间,导致该行被锁定3秒钟。我对这一点的理解正确吗?在我的事务中发生缓慢的API命中的情况下,如果我移动查询的位置,以便在所有缓慢的API请求之后才发生SELECT FOR UPDATE,这是否会产生一次不锁定行数秒的明显效果(在我的应用程序中select_for_update的情况是不可避免的)?或者,我是不是误解了,不知何故,直到事务结束,SQL都没有真正命中数据库?

您对代码的假设是正确的。如果查看select_for_update()文档,此操作会锁定数据库中的这些行,直到它们被解锁。这实际上会在您的urllib请求期间锁定。

如果在请求后将数据库调用移到条件中,那么数据库将被锁定的时间会短得多,这一点再次正确(尽管如果调用了alot,仍然会有一些客户端由于争用而阻止调用)。

相关内容

  • 没有找到相关文章

最新更新