我有一个Django应用程序。
这个Django应用程序向Twitter发出api调用并获取我最近的100条推文。我需要将推文插入数据库。
我有一种方法可以对所有100条推文采取行动。这个方法有一个for循环,我在每个Tweet中创建一个模型实例,并分别在每个实例上调用instance.save()。
我发现事情变慢了,并认为交易可能会让事情变得更快。
因此,在方法之外我添加了@method_decorator(transaction.atomic)
。我仍然有一个for循环,我在其中创建模型实例并执行instance.save(),但现在该方法使用transaction.atomic进行修饰。
答案 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)
没有。数据库事务的目的是确保数据完整性。有关详细信息,请参阅Wikipedia。
是。使用交易不会影响这一点。
没有。
应该使代码更快的是在一次查询中一次性提交新记录,而不是一次提交一次。看看Django的bulk_create
。总是很难预测性能,但我怀疑这会显着改善。