2012-08-06 187 views
1

我正在使用C++ shell扩展DLL,它用于读取数据到SQLite数据库表中并将数据写入数据库。还有另一个应用程序(exe)用于访问所有表。SQLite数据库文件在插入/删除期间被锁定

有时,当我尝试删除/插入/更新到SQLite数据库表时,我的dll显示异常“数据库文件被锁定”。这是因为其他应用程序此时正在访问表。

有没有什么办法可以解决这个问题从我的DLL?我是否可以使用该解决方案为在链接中提到:“http://stackoverflow.com/questions/6455290/implementing-sqlite3-busy-timeout-in-an-ios-app

在当前的代码,我正在使用CppSQLite3.cpp方法execQuery(const char * szSQL)来执行SQL查询。

请指教。

回答

0

首先,你应该知道的SQLite做了数据库级锁。当你启动一个事务并且另一个应用程序试图向同一个数据库写入内容时,你会得到Database is locked,并且SQLite会自动尝试在sqlite3_busy_timeout间隔后执行相同的查询。

因此,关键是要确保你保持你的交易是尽可能短即
1.做一个开始交易
2.更新/删除/插入
3.提交

,而不是这三个步骤之间还有其他任何东西。 并且还会根据交易的规模增加您的sqlite3_busy_timeout间隔以适应您的应用程序。

您可以尝试WAL模式,在此模式下可以同时读取和写入SQLite。但它有它自己的一套缺点。你可以参考SQLite documentation

+0

谢谢@ DJK。谢谢omggs。我们的exe和DLL应用程序正在访问相同的数据库表。 Exe访问table1,table2和table3。 DLL正在访问table1和table2。问题是Exe-table3插入需要更长的时间。这导致数据库文件锁定方案。我认为解决方法是将table3移动到另一个数据库。我认为这会解决我们的问题 – JChan 2012-08-07 14:49:22

+0

@JChan:不客气!当然,您可以将表移动到另一个数据库或增加适合您的应用程序的繁忙时间! – omggs 2012-08-08 04:37:44