我的项目有一个 C++ dll,其中在 Sqllite 中创建一个数据库,共享拒绝=无。这个 dll 会将数据插入到数据库中,我有一个 C# .exe,它必须访问数据库并显示它。显示需要异步完成。在启动与 sqlitedb 的连接时,有什么方法可以锁定表或数据库吗?如果可能的话,任何人都可以给我链接或有关如何完成此操作的示例吗?提前致谢。
查看 SQLite pragma-s。http://www.sqlite.org/pragma.html
PRAGMA锁定模式;
PRAGMA 锁定模式 = NORMAL | 独家的
该编译指示设置或查询数据库连接锁定模式。锁定模式为 NORMAL 或 EXCLUSIVE。
在 NORMAL 锁定模式(默认)下,数据库连接在每个读或写事务结束时解锁数据库文件。当锁定模式设置为 EXCLUSIVE 时,数据库连接永远不会释放文件锁。第一次以 EXCLUSIVE 模式读取数据库时,将获取并持有共享锁。第一次写入数据库时,会获取并持有排它锁。
通过关闭数据库连接或使用此编译指示将锁定模式设置回 NORMAL,然后访问数据库文件(用于读取或写入),可以释放以 EXCLUSIVE 模式连接获得的数据库锁。简单地将锁定模式设置为 NORMAL 是不够的 - 直到下次访问数据库文件时才会释放锁定。
将锁定模式设置为 EXCLUSIVE 有两个原因。一是应用程序是否确实想要阻止其他进程访问数据库文件。另一个是该模式下启用的优化节省了少量文件系统操作。这在嵌入式环境中可能很重要。
当locking_mode pragma指定特定数据库时,例如:
PRAGMA main.locking_mode=EXCLUSIVE; 那么锁定模式仅适用于指定的数据库。如果“locking_mode”关键字之前没有数据库名称限定符,则锁定模式将应用于所有数据库,包括后续 ATTACH 命令添加的任何新数据库。
“temp”数据库(其中存储 TEMP 表和索引)和内存数据库始终使用独占锁定模式。临时数据库和内存数据库的锁定模式无法更改。所有其他数据库默认使用正常锁定模式,并受此编译指示的影响。
PRAGMA同步;
PRAGMA 同步 = 0 | 关闭 | 1 | 正常 | 2 | 满的;
查询或更改“同步”标志的设置。第一个(查询)形式将以整数形式返回同步设置。当 synchronous 为 FULL (2) 时,SQLite 数据库引擎将在关键时刻暂停,以确保数据实际上已写入磁盘表面,然后再继续。这可以确保如果操作系统崩溃或断电,数据库在重新启动后不会损坏。FULL synchronous 非常安全,但也比较慢。当 synchronous 为 NORMAL (1) 时,SQLite 数据库引擎仍会在最关键的时刻暂停,但频率低于 FULL 模式。在错误的时间发生电源故障可能会损坏正常模式下的数据库,这种可能性非常小(尽管非零)。但实际上,您更有可能遭受灾难性的磁盘故障或其他一些不可恢复的硬件故障。使用同步 OFF (0),SQLite 在将数据传递给操作系统后立即继续而不暂停。如果运行 SQLite 的应用程序崩溃,数据将是安全的,但如果操作系统崩溃或计算机在数据写入磁盘表面之前断电,数据库可能会损坏。另一方面,同步关闭时某些操作的速度提高了 50 倍或更多倍。
默认设置是同步=完整。