【发布时间】:2019-09-10 00:18:56
【问题描述】:
当FDConnection 使用SQLite 驱动程序时,它的LockingMode 属性默认设置为Exclusive。但是,这似乎没有按预期工作。
运行以下代码时,打开第二个连接时不会出错:
FDConnection1.Params.Database := DB_PATH;
FDConnection1.Open();
FDQuery1.SQL.Text := 'update admin set last_write = 2';
FDQuery1.ExecSQL;
FDConnection2.Params.Database := DB_PATH;
FDConnection2.Open();
专门为独占锁定模式设置 SQLite pragma 似乎也不起作用:
FDConnection1.Params.Database := DB_PATH;
FDConnection1.Open();
FDQuery1.SQL.Text := 'PRAGMA locking_mode = EXCLUSIVE';
FDQuery1.ExecSQL;
FDQuery1.SQL.Text := 'update admin set last_write = 2';
FDQuery1.ExecSQL;
FDConnection2.Params.Database := DB_PATH;
FDConnection2.Open();
同样,打开第二个连接时没有错误。
在打开 SQLite 数据库时如何影响独占锁定模式?为什么手动设置PRAGMA 不起作用?
编辑
经过进一步测试,我看到打开第二个连接与不同的组件集,例如UniDAC 或 ZeosLib 实际上会导致错误。
但是,打开第二个 FDConnection 甚至写入该连接时都不会发生错误。无论如何,FireDAC 连接似乎都以某种方式共享..
【问题讨论】:
-
“不工作”到底是什么意思?连接有效但不会阻止其他应用程序使用数据库,还是什么?
-
"打开第二个连接没有错误。"此外,使用第二个连接执行读/写时也没有错误。
-
我认为 FireDac 不会为与本地数据库(文件)的每个连接创建 SQLite“引擎”。共享引擎意味着共享独占访问。不确定是否有办法强制它使用另一个引擎,也许使用 FDPhysSQLiteDriverLink1。
-
“共享引擎” - 它在哪里说它是共享引擎?