如何与FireDAC SQLite建立排他性连接?

时间:2019-09-09 13:56:28

标签: sqlite delphi firedac

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编译指示似乎也不起作用:

  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连接都以某种方式共享。

1 个答案:

答案 0 :(得分:0)

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

SQLite 3 documentation

是:

  

需要EXCLUSIVE锁才能写入到数据库文件。   文件上仅允许一个EXCLUSIVE锁,而不允许其他任何锁   任何类型都可以与EXCLUSIVE锁共存。为了   最大程度地提高并发性,SQLite致力于最大程度地减少并发时间   排他锁。

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

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