Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django中的事务处理是否加快了速度_Django_Database_Transactions - Fatal编程技术网

Django中的事务处理是否加快了速度

Django中的事务处理是否加快了速度,django,database,transactions,Django,Database,Transactions,我有一个Django应用程序 这个Django应用程序对Twitter进行api调用,并获取我最近的100条推文。我需要将推文插入数据库 我有一个方法来处理所有100条推文。这个方法有一个for循环,我从每个Tweet中创建一个模型实例,并分别对每个实例调用instance.save() 我发现事情变慢了,并认为事务处理可能会使事情变得更快 因此,在方法之外,我添加了@method\u decorator(transaction.atomic)。我仍然有一个for循环,我在其中创建了model

我有一个Django应用程序

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

我有一个方法来处理所有100条推文。这个方法有一个for循环,我从每个Tweet中创建一个模型实例,并分别对每个实例调用instance.save()

我发现事情变慢了,并认为事务处理可能会使事情变得更快

因此,在方法之外,我添加了
@method\u decorator(transaction.atomic)
。我仍然有一个for循环,我在其中创建了model instance和do instance.save(),但现在该方法用transaction.atomic修饰

  • transaction.atomic应该让我更快地插入数据库吗
  • 每个instance.save()调用是否仍会发出一个数据库调用
  • 如果它能让事情变得更快,那怎么办
  • 否。数据库事务的目的是确保数据完整性。有关更多信息,请参阅

  • 对。使用事务不会影响这一点

  • 没有


  • 让您的代码更快的是在一个查询中一次提交所有新记录,而不是一次提交一个记录。看看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()。