我有一个sqlite3数据库可以被几个线程(3-4)访问。我知道sqlite3关于并发性的一般限制,如http://www.sqlite.org/faq.html#q6所述,但我相信这不是问题。sqlite3'数据库被锁定'不会因重试而消失
所有的线程都从这个数据库读取和写入。每当我写,我有以下结构:
try:
Cursor.execute(q, params)
Connection.commit()
except sqlite3.IntegrityError:
Notify
except sqlite3.OperationalError:
print sys.exc_info()
print("DATABASE LOCKED; sleeping for 3 seconds and trying again")
time.sleep(3)
Retry
在某些运行时,我甚至不会打这个块,但是当我做,它永远不会出来的它(保持重试,但我一直如果我正确理解读写器锁的使用情况,一些等待可以帮助争用,这听起来像是死锁,但我没有在我的代码中使用任何事务,并且每个SELECT或INSERT都只是一个关闭,但是某些线程在执行操作时会保持相同的连接(其中包括SELECTS和INSERTS以及其他修饰符的混合)
如果可以,我会修改它为此遮光,还有修复它的方法(除了使用不同的数据库引擎)。
你可以建立一个非常小的隔离测试用例来证明这个问题吗?如果我们有可执行代码并且可以看到整个事情,那会更容易。 – Dustin 2010-01-12 18:59:36
嗨达斯汀,这可能实际上证明很难,因为即使有更大的代码库,我也很难再现它。我主要想知道这是否是一个常见问题,以及sqlite3中是否存在已知的死锁问题。我会暂时发布我不那么优雅的修补程序。 – BME 2010-01-13 14:26:52