Python SQLite3 - 每个插入语句都有BEGIN,END事务吗?

时间:2014-06-23 17:09:12

标签: python sql sqlite

我正在尝试优化我的SQLite3插入,因为我正在处理一些大型数据集。

我想知道的是.execute(“INSERT ...”)语句是否为每个执行语句BEGIN和END一个事务?或者它只是在第一次执行时执行BEGIN,它等待.commit()操作,因此我可以执行10,000个.execute命令,然后执行.commit(),因此我只做了一次事务?

我对这个故事的那一方不是很清楚,我真的很感激任何有关此事的意见。

2 个答案:

答案 0 :(得分:0)

documentation说:

  

默认情况下, sqlite3 模块在数据修改语言(DML)语句之前隐式打开事务(即INSERT / UPDATE / DELETE / {{ 1}}),并在非DML非查询语句之前隐式提交事务(即REPLACE或上述之外的任何语句)。

答案 1 :(得分:0)

来自SQLite优化常见问题解答[1]:

  

除非已经在事务中,否则每个SQL语句都有一个新的   交易开始了。这是非常昂贵的,因为它需要   重新打开,写入和关闭每个日志文件   声明。这可以通过包装SQL语句序列来避免   与BEGIN TRANSACTION;和END TRANSACTION;声明。这种加速   也可以获取不会改变数据库的语句。

所以,有两种方法:

  1. 使用executemany()方法。
  2. 使用明确的BEGINCOMMIT语句。
  3. [1] http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html