Django中的事务处理是否加快了速度
我有一个Django应用程序 这个Django应用程序对Twitter进行api调用,并获取我最近的100条推文。我需要将推文插入数据库 我有一个方法来处理所有100条推文。这个方法有一个for循环,我从每个Tweet中创建一个模型实例,并分别对每个实例调用instance.save() 我发现事情变慢了,并认为事务处理可能会使事情变得更快 因此,在方法之外,我添加了Django中的事务处理是否加快了速度,django,database,transactions,Django,Database,Transactions,我有一个Django应用程序 这个Django应用程序对Twitter进行api调用,并获取我最近的100条推文。我需要将推文插入数据库 我有一个方法来处理所有100条推文。这个方法有一个for循环,我从每个Tweet中创建一个模型实例,并分别对每个实例调用instance.save() 我发现事情变慢了,并认为事务处理可能会使事情变得更快 因此,在方法之外,我添加了@method\u decorator(transaction.atomic)。我仍然有一个for循环,我在其中创建了model
@method\u decorator(transaction.atomic)
。我仍然有一个for循环,我在其中创建了model instance和do instance.save(),但现在该方法用transaction.atomic修饰
让您的代码更快的是在一个查询中一次提交所有新记录,而不是一次提交一个记录。看看Django的。总是很难预测性能,但我怀疑这会显著改善情况。在原子事务中,一系列数据库操作要么全部发生,要么什么也不发生。 将一个方法装饰为
atomic
将保证该方法中的代码块在数据库中的原子性。如果方法成功完成,更改将提交到数据库。如果出现异常,将回滚更改
1。根据您的用例,事务不会使您的代码更快。事实上,它只会保证所有
推文
都将保存到数据库中,或者在异常情况下不会保存任何推文
2。是的,每个实例.save()
调用都将是一个数据库调用。因此,每次将有100个数据库调用
3。同样,对于您的用例来说,事务不会使其更快。
那么如何让事情变得更快?
您可以使用Django在一个查询中创建所有的tweets
Tweet.objects.bulk_create([tweet1, tweet2, ...., tweet100]) # single query
这将以一种高效的方式将
tweet
对象列表插入数据库,只需一次查询。“事务不会使您的代码更快。”——实际上,这通常是不正确的。简单地说,打开和关闭一个交易要比打开和关闭100个交易少很多工作。根据您的后端和存储引擎,这可能涉及磁盘I/O,这可能是一个主要瓶颈bulk_create()
仍然是提高性能的首选,一次可以容纳100个项目,但不要将事务视为加速代码的一种手段。(测量它,总是测量它。)是的,我同意你的观点。稍微修改了ans,使其不能泛化。是的,在这两种情况下测量时间会得到更好的结果。这在以前是不可能的,这导致为每个对象调用save()。