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

Aks*_*aaj 4 database django 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. 如果它让事情变得更快,那怎么样?

Rah*_*pta 7

在原子事务中,一系列数据库操作全部发生,或者什么都不发生.

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

1.根据您的使用情况,交易不会使您的代码更快.事实上,它只是保证将所有的tweets内容保存到数据库中,或者tweets在异常的情况下不保存任何内容.

是的,每次instance.save()通话都是数据库通话.因此,每次都会有100个数据库调用.

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

如何让事情更快呢?

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

Tweet.objects.bulk_create([tweet1, tweet2, ...., tweet100]) # single query
Run Code Online (Sandbox Code Playgroud)

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

  • "交易不会让你的代码更快." - 在实践中,这通常是不正确的.简而言之,打开和关闭单个交易比打开和关闭100个交易要少.根据您的后端和存储引擎,这可能涉及磁盘I/O,它可能是一个主要的瓶颈.`bulk_create()`仍然是提高性能的首选,并且一次可以容纳100个项目,但不要只是忽略事务来加速代码.(并测量它,总是测量它.) (7认同)