Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何实现与FireDAC SQLite的独占连接?_Sqlite_Delphi_Firedac - Fatal编程技术网

如何实现与FireDAC SQLite的独占连接?

如何实现与FireDAC SQLite的独占连接?,sqlite,delphi,firedac,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;

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)打开第二个连接确实会导致错误


但是,在打开第二个FDI连接或甚至写入该连接时不会发生错误。似乎FireDAC连接在某种程度上是共享的,无论发生什么情况。

我认为您误解了独占锁的含义

从以下方面来看:

需要独占锁才能写入数据库文件。 文件上只允许有一个排他锁,不允许有其他锁 任何类型都允许与独占锁共存。为了 最大限度地提高并发性,SQLite可以最大限度地减少 持有专用锁

只有在尝试写入数据库文件时才会请求此锁。(请参阅:5.0写入数据库文件)


为了证实这一点,我使用SQLiteStudio和一个简单的Delphi应用程序进行了一个简单的测试,其中我指示SQLiteStudio添加100万条记录,并尝试使用Delphi应用程序添加一条记录。我总是收到Firedac错误
数据库被锁定。

我认为您误解了独占锁的含义

从以下方面来看:

需要独占锁才能写入数据库文件。 文件上只允许有一个排他锁,不允许有其他锁 任何类型都允许与独占锁共存。为了 最大限度地提高并发性,SQLite可以最大限度地减少 持有专用锁

只有在尝试写入数据库文件时才会请求此锁。(请参阅:5.0写入数据库文件)


为了证实这一点,我使用SQLiteStudio和一个简单的Delphi应用程序进行了一个简单的测试,其中我指示SQLiteStudio添加100万条记录,并尝试使用Delphi应用程序添加一条记录。我总是收到Firedac错误
数据库被锁定。

你说的“不工作”到底是什么意思?连接可以工作,但不会阻止其他应用使用db,或者什么?“打开第二个连接时没有错误。”此外,使用第二个连接执行读/写操作时也没有错误。我认为FireDac不会为每个到本地数据库(文件)的连接创建SQLite“引擎”。共享引擎意味着共享独占访问。不确定是否有办法强迫它使用另一个引擎,可能是使用FDPhysSQLiteDriverLink1。“共享引擎”-它在哪里说它是共享引擎?你所说的“不工作”到底是什么意思?连接可以工作,但不会阻止其他应用使用db,或者什么?“打开第二个连接时没有错误。”此外,使用第二个连接执行读/写操作时也没有错误。我认为FireDac不会为每个到本地数据库(文件)的连接创建SQLite“引擎”。共享引擎意味着共享独占访问。不确定是否有办法强制它使用另一个引擎,可能是使用FDPhysSQLiteDriverLink1。“共享引擎”-它在哪里说它是共享引擎?不清楚您在SQLiteStudio中使用的是哪种独占模式。“只有在尝试写入数据库文件时才会请求此锁。”正确,这就是我在代码示例中执行写入的原因。使用第二个连接写入数据库时也不会发生错误。@RaelB所有写入操作都需要独占锁。我使用了SqListuudio,因为我知道它是用C++和Qt(非FixDAC解决方案)编写的。测试的目的是确认上面的引文,即在写入时只允许使用一个独占锁。@RaelB阅读链接文档。您将看到写入数据库文件所需的锁。firedac和其他任何解决方案一样,都需要确认文档中的规范。您只需在设计时将
TFDConnection.Connected
属性设置为
True
,然后运行应用程序,并尝试执行操作,就会发现db已被锁定。没有必要让SQLiteStudio这样做。不清楚您在SQLiteStudio中使用的是哪种独占模式。“只有在尝试写入数据库文件时才会请求此锁。”正确,这就是我在代码示例中执行写入的原因。使用第二个连接写入数据库时也不会发生错误。@RaelB所有写入操作都需要独占锁。我使用了SqListuudio,因为我知道它是用C++和Qt(非FixDAC解决方案)编写的。测试的目的是确认上面的引文,即在写入时只允许使用一个独占锁。@RaelB阅读链接文档。您将看到写入数据库文件所需的锁。firedac和其他任何解决方案一样,都需要确认文档中的规范。您只需在设计时将
TFDConnection.Connected
属性设置为
True
,然后运行应用程序,并尝试执行操作,就会发现db已被锁定。这样做不需要SQLite Studio。