Python SQLite-如何手动开始和结束事务?
上下文 因此,我试图找出在Python中使用SQLite时如何正确覆盖自动事务。当我试着跑的时候Python SQLite-如何手动开始和结束事务?,python,sqlite,transactions,Python,Sqlite,Transactions,上下文 因此,我试图找出在Python中使用SQLite时如何正确覆盖自动事务。当我试着跑的时候 cursor.execute("BEGIN;") .....an assortment of insert statements... cursor.execute("END;") 我得到以下错误: OperationalError: cannot commit - no transaction is active 我理解这一点是因为Python中的SQLite会在每个修改语句上自动打开一个事务
cursor.execute("BEGIN;")
.....an assortment of insert statements...
cursor.execute("END;")
我得到以下错误:
OperationalError: cannot commit - no transaction is active
我理解这一点是因为Python中的SQLite会在每个修改语句上自动打开一个事务,在本例中是一个INSERT
问题:
我试图通过每数千条记录做一个事务来加快插入速度。
如何克服自动打开交易的问题?说明:
您可以通过connect()调用的隔离级别参数或连接的隔离级别属性来控制sqlite3隐式执行哪种类型的BEGIN
语句(或根本不执行)
如果需要自动提交模式,则将隔离级别设置为None
正如@CL.所说,您必须将隔离级别设置为
None
。代码示例:
s = sqlite3.connect("./data.db")
s.isolation_level = None
try:
c = s.cursor()
c.execute("begin")
...
c.execute("commit")
except:
c.execute("rollback")
我对这句话有一个疑问:“如果你想要自动提交模式,那么将隔离级别设置为None。”,这是否意味着,在我们将隔离级别设置为None之后,任何类型的DML操作都将自动提交?因此,性能无法提高。我的理解是否正确?我从这个URL跳到这里:我和@ClockZHONG有着同样的担忧。根据我所做的一些调试,我认为该文档有误导性,它真正应该说的是
如果您想要手动处理事务,那么将隔离级别设置为None
。我发现这澄清了python文档所指的“autocommit”。似乎如果没有使用BEGIN语句,所有语句都以“自动提交”模式执行。因此,就我们用BEGIN/COMMIT来封装语句而言,当隔离级别设置为None时,就没有这样的自动提交。希望有帮助。