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

时间:2012-08-24 13:57:39

标签: sql django select transactions transaction-isolation

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

@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点击的情况下,如果我移动查询的位置,以便在之后之后才发生SELECT FOR UPDATE所有缓慢的API请求,这会有一个看似明显的效果:一次不锁定我的行几秒钟(我的应用程序中select_for_update的情况是不可避免的)?或者,我是否误解了,并且在事务结束之前,某些SQL实际上都没有命中数据库?

1 个答案:

答案 0 :(得分:1)

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

如果你要在请求之后将数据库调用移动到条件中,那么再次正确的是数据库将被锁定的时间要短得多(尽管如果这被称为很多,仍会有一些客户端阻塞由于争用的电话)。