【问题标题】:How to achieve an exclusive connection with FireDAC SQLite?如何实现与 FireDAC SQLite 的独占连接?
【发布时间】: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。
  • “共享引擎” - 它在哪里说它是共享引擎?

标签: sqlite delphi firedac


【解决方案1】:

我认为你误解了 EXCLUSIVE 锁的含义。

来自SQLite 3 documentation 是:

需要一个独占锁才能写入到数据库文件。 文件上只允许有一个 EXCLUSIVE 锁,不允许有其他锁 任何种类都允许与独占锁共存。为了 最大化并发性,SQLite 致力于最小化 持有独占锁。

仅在尝试写入数据库文件时才请求此锁。 (参见:5.0 写入数据库文件

为了确认这一点,我使用 SQLiteStudio 和一个简单的 Delphi 应用程序进行了一个简单的测试,我指示 SQLiteStudio 添加 100 万条记录,并尝试使用 Delphi 应用程序添加一条记录。我总是收到 Firedac 错误 Database is locked.

【讨论】:

  • 不清楚你在SQLiteStudio中使用的是哪种独占模式。 “仅在尝试写入数据库文件时才请求此锁。”正确,这就是我在代码示例中执行写入的原因。使用第二个连接写入数据库时​​也不会发生错误。
  • @RaelB 所有写操作都需要独占锁。我使用 SQLiteStudio,因为我知道它是用 c++ 和 QT(非 fireac 解决方案)编写的。测试的重点是确认上面的引用,写的时候只允许一个独占锁。
  • @RaelB 阅读链接文档。您将看到写入数据库文件所需的锁。与其他任何解决方案一样,firedac 都需要确认文档中的规范。
  • 在设计时只需将TFDConnection.Connected 属性设置为True 就会出现错误,然后运行您的应用程序,并尝试执行一个操作,您会发现db已经锁定。不需要 SQLite Studio 来执行此操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 2018-09-10
  • 2010-09-22
  • 1970-01-01
相关资源
最近更新 更多