SQLite数据库当前正在使用中
本文关键字:数据库 SQLite | 更新日期: 2023-09-27 18:00:25
我正在编写一个C#程序,该程序访问数据库,但网络中的其他程序也访问该数据库。它是一个SQLite数据库。现在我想问如果有人只是在SQLite数据库中写入,是否可以检查它
我曾认为我的程序可以尝试写入SQLite数据库,如果其他人在数据库中写入,我会收到警告"拒绝访问"。
但是我如何在C#中实现这一点呢?
很抱歉英语不好
您需要一个不同的数据库:SQLite无法处理并发写入连接。仅并发读取。
SQLite作为本地/客户端存储的嵌入式数据库是一个不错的选择,但如果您需要来自不同线程/PC的连接,则需要与Sql Server Express不同的解决方案。
如果必须使用SQLite,那么应该设置一种机制,在写入时捕获拒绝访问异常并自动检索,直到可配置的超时到期。
如SQLite文档中所述
当SQLite试图访问被另一个进程锁定的文件时,默认行为是返回SQLite_BUSY
测试SQLITE_BUSY。以下是一些伪代码来说明解决方案:
while (continueTrying) {
retval = sqlite_exec(db, sqlQuery, callback, 0, &msg);
switch (retval) {
case SQLITE_BUSY:
Log("[%s] SQLITE_BUSY: sleeping fow a while...", threadName);
sleep a bit... (use something like sleep(), for example)
break;
case SQLITE_OK:
continueTrying = NO; // We're done
break;
default:
Log("[%s] Can't execute '"%s'": %s'n", threadName, sqlQuery, msg);
continueTrying = NO;
break;
}
}
return retval;
SQLite多线程参考
SQLite是基于文件的,因此它不支持同时进行多个连接。
你可以做的是尝试获得文件的锁定,如果失败,你知道其他人正在使用它,然后你可以向用户显示一条消息,或者可能实现一个重试机制,暂停几秒钟,然后重试等等。
最重要的是,不可能同时使用Sqlite数据库文件。