Django中的事务使事情变得更快

时间:2015-07-11 08:04:05

标签: django database transactions

我有一个Django应用程序。

这个Django应用程序向Twitter发出api调用并获取我最近的100条推文。我需要将推文插入数据库。

我有一种方法可以对所有100条推文采取行动。这个方法有一个for循环,我在每个Tweet中创建一个模型实例,并分别在每个实例上调用instance.save()。

我发现事情变慢了,并认为交易可能会让事情变得更快。

因此,在方法之外我添加了@method_decorator(transaction.atomic)。我仍然有一个for循环,我在其中创建模型实例并执行instance.save(),但现在该方法使用transaction.atomic进行修饰。

  1. 对于我来说,transaction.atomic是否应该更快地插入数据库?
  2. 每个instance.save()调用是否仍会发出数据库调用?
  3. 如果它让事情变得更快,那又怎么样?

2 个答案:

答案 0 :(得分:7)

在原子事务中,发生 all 的一系列数据库操作,或 nothing

将方法装饰为atomic将保证数据库中该方法中的代码块的原子性。如果方法成功完成,则将更改提交到数据库。如果存在异常,则会回滚更改。

<强> 1。根据您的使用情况,交易不会使您的代码更快。事实上,它只会保证所有tweets都将保存到数据库中,或者tweets都不会在例外的情况下保存。

<强> 2。是的,每个instance.save()调用都是数据库调用。因此,每次都会有100个数据库调用。

第3。同样,交易不会使您的用例更快。

如何让事情变得更快?

您可以使用Django的bulk_create在单个查询中创建所有tweets

Tweet.objects.bulk_create([tweet1, tweet2, ...., tweet100]) # single query

这仅在1个查询中以有效的方式将tweet个对象列表插入到数据库中。

答案 1 :(得分:2)

  1. 没有。数据库事务的目的是确保数据完整性。有关详细信息,请参阅Wikipedia

  2. 是。使用交易不会影响这一点。

  3. 没有。

  4. 应该使代码更快的是在一次查询中一次性提交新记录,而不是一次提交一次。看看Django的bulk_create。总是很难预测性能,但我怀疑这会显着改善。