我们目前在多用户环境中使用SQLite时遇到数据库锁定问题。由于已关闭日志记录以减少数据库锁定异常的数量,因此这些问题与常规数据库畸形问题相结合。
我的同事目前正在实施同步算法,以允许用户在本地SQLite数据库上工作,并将数据近乎瞬间传输到网络上的主数据库。
更改本地行时,Sync标志设置为true。同步算法由每秒运行一次的计时器触发,包括两种方法:上传和下载。下面提到的任何SQL命令都是使用String.Format。
构建的在上载期间,将扫描本地数据库以查找Sync标志为true的行。像这样的每一行都要更新或插入到主数据库中(取决于是否可以使用相同的PK找到一行)。
在下载期间,每个本地表逐行逐个字段地比较到master数据库中的相应表(两个表都作为数组结构加载到内存中以加速比较)。如果发现任何差异,或者缺少本地行,则使用master数据库中的数据更新/插入本地行
忽略了一个显而易见的事实,即这不会解决我们的锁定/畸形问题,我的直觉告诉我这是一个可怕的想法,但我无法向权力解释这个问题。任何人都可以提供一些推理,说明为什么这会是一个可怕的想法,或者也许是我忽略的一些积极因素。
答案 0 :(得分:1)
关闭日记功能不会减少锁定冲突的数量,只会将锁定异常转换为保证数据库损坏。
解决锁定冲突的正确方法是等到另一个连接完成更改。使用System.Data.SQLite时,可以在连接字符串中将其设置为Default Timeout
,默认值为30秒(我不知道XPO使用的驱动程序)。
如果这没有给你足够的并发性,你应该切换到像MySQL或PostgreSQL这样的客户端/服务器数据库。
同步下载很愚蠢:无论如何,您正在读取整个数据库,因此将整个数据库文件复制到本地计算机会更容易,更快。
如果您认为来自The Authorities的单词可能更有可能说服您的PHB,请在sqlite-users mailing list上提出此问题。