我试图使用Python(传统的,2.7)和SQLite(3)来编写book indexer。
代码可以归结为以下SQL语句序列:'select count(*) from tag_dict' ()
/* [(30,)] */
'select count(*) from file_meta' ()
/* [(63613,)] */
'begin transaction' ()
'select id from archive where name=?' ('158326-158457.zip',)
/* [(20,)] */
'select id from file where name=? and archive=?' ('158328.fb2', 20)
/* [(122707,)] */
'delete from file_meta where file=?' (122707,)
'commit transaction' ()
# error: cannot commit - no transaction is active
隔离级别是'DEFERRED'('EXCLUSIVE'没有更好的选择)。
我试图使用connection.commit()而不是cursor.execute('commit')-没有发生任何有用的事情。当然,我已经搜索过stackoverflow和Net,但是找到的答案是不相关的。
由于性能原因,自动提交模式不可接受。
我一次使用唯一的数据库文件。
我的代码是单线程运行的。
所有的SQL执行都是通过一个函数完成的,这个函数确保我一次只打开一个游标。
那么,这里的交易怎么了?
如果我使用connection.commit()(注意:没有connection.begin方法!),那么我只是丢失了数据。
当然,我已经对数据库文件及其目录的文件权限进行了double/triple/d检查。
好吧,我经常在提出问题后一分钟就找到了解决办法。
作为一个新手,我有8个小时不能回答自己的问题。。。
所以,答案就在这里:
解决方案是found here,由唯一的想法组成:
不要在Python应用程序的非自动提交模式下使用BEGIN/COMMIT-仅使用db.COMMIT()和db.rollback()!
这听起来很奇怪,但确实有效。