我有一些曾经工作的代码,但在Windows上升级到Python 3.6.0后,我遇到了错误。我可以确认相同的代码在Python 3.5.2中运行得很好。我将问题缩小到以下非常简单的代码,我试图在数据库上显式设置写入器锁:
>>> import sqlite3
>>> conn = sqlite3.connect('testDB.db')
>>> cur = conn.cursor()
>>> conn.in_transaction
False
>>> cur.execute('BEGIN IMMEDIATE')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
sqlite3.OperationalError: cannot start a transaction within a transaction
相同的代码与Python 3.5.2没有任何问题:
>>> cur.execute('BEGIN IMMEDIATE')
<sqlite3.Cursor object at 0xb710ab60>
我尝试使用conn = sqlite3.connect('testDB.db', isolation_level='IMMEDIATE')
但没有成功。请注意,我没有进行任何事务,例如INSERT甚至SELECT。
更新: 我在Python sqlite3 documentation上注意到以下内容:
&#34;在版本3.6中更改:sqlite3用于在DDL语句之前隐式提交打开的事务。现在不再是这样了。&#34;
这意味着什么以及如何修复我的代码以便我仍然可以显式锁定数据库?
答案 0 :(得分:1)
如果您想使用Python的自动事务处理,请将isolation_level
保留为其默认值,或将其设置为三个级别之一。
如果您想进行自己的事务处理,则必须通过将isolation_level
设置为None
来阻止Python自行处理。
答案 1 :(得分:1)
这是一个错误。它将在Python 3.6.1中修复:https://bugs.python.org/issue28518