0

我们目前在多用户环境中使用 SQLite 遇到数据库锁定问题。由于已关闭日志记录以减少数据库锁定异常的数量,因此这些问题与常规数据库畸形问题相结合。

我的同事目前正在实施一种同步算法,以允许用户在本地 SQLite 数据库上工作,并将该数据近乎即时地传输到网络上的主数据库。

当更改本地行时,同步标志设置为真。同步算法由每秒运行的计时器触发,包括上传和下载两种方法。下面提到的任何 SQL 命令都是使用 String.Format 构建的。

在上传期间,会扫描本地数据库以查找同步标志为真的行。像这样的每一行要么被更新,要么被插入到主数据库中(取决于是否可以找到具有相同 PK 的行)。

在下载过程中,每个本地表都会逐行、逐字段地与主数据库中的相应表进行比较(两个表都作为数组结构加载到内存中以加快比较速度)。如果发现任何差异,或者缺少本地行,则使用主数据库中的数据更新/插入本地行

忽略这样一个明显的事实,即这不会解决我们的锁定/畸形问题,我的直觉告诉我这是一个糟糕的想法,但我很难向那个权力解释这个。任何人都可以提供一些理由来说明为什么这将是一个糟糕的想法,或者可能是我忽略了一些积极因素。

4

1 回答 1

1

关闭日志不会减少锁定冲突的数量,它只是将锁定异常转换为有保证的数据库损坏。

处理锁定冲突的正确方法是等到另一个连接完成更改。使用 System.Data.SQLite 时,可以将其设置为Default Timeout连接字符串,默认为 30 秒(我不知道 XPO 使用什么驱动程序)。如果这不能给你足够的并发性,你应该切换到像 MySQL 或 PostgreSQL 这样的客户端/服务器数据库。

同步下载很愚蠢:无论如何您都在读取整个数据库,因此将整个数据库文件复制到本地机器会更容易和更快。


如果您认为The Authorities的一句话更有可能说服您的 PHB,请在sqlite-users 邮件列表中提出这个问题。

于 2012-10-18T14:16:35.640 回答