当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连接都以某种方式共享。
答案 0 :(得分:0)
我认为您误解了EXCLUSIVE锁的含义。
从SQLite 3 documentation的是:
需要EXCLUSIVE锁才能写入到数据库文件。 文件上仅允许一个EXCLUSIVE锁,而不允许其他任何锁 任何类型都可以与EXCLUSIVE锁共存。为了 最大程度地提高并发性,SQLite致力于最大程度地减少并发时间 排他锁。
仅在尝试写入数据库文件时才请求此锁定。 (请参阅: 5.0写入数据库文件)
为确认这一点,我使用SQLiteStudio和一个简单的Delphi应用程序进行了简单测试,指示SQLiteStudio添加100万条记录,并尝试使用Delphi应用程序添加一条。我总是收到Firedac错误Database is locked.