为了解决多线程,多进程操作sqlite。进行了一些实测。以下为个人实测得出结论,非官方文档:

名词解释:

写状态: 处理事务中,并执行了修改数据操作,但未提交事务。

写锁:处理事务中,写数据。

读锁:处理事务中,读数据。

相关参数解读:

UpdateOptions.lockwait : 其它进程处于事务或写状态时,会阻止当前进程进入事务或写数据,这时是否等待,等待时间为BusyTimeout,如果超时,会报database is locked错误。

BusyTimeout: 超时时间,默认为10000.(10秒),如果UpdateOptions.lockwait = false,则此参数无效。

TxOptions.isolation : 事务级别

xiSerializible 或xiSnapshot 同一时刻只能有一个进程处于事务中。当一个进程进入事务时,其它进程进入事务时会等待。

设置成其它参数时,可以两个进程同时进入事务状态,但如果一个进程于事务中执行了写数据。不管这个事务是否已commit. 其它进程中的事务进行写操作都会报database is locked.

SharedCache:共享缓存,建议设置上。实测进程间也是可以一个事务提交,另一个进程立刻就可以读出。

LockedMode: 这个简单,必须设置成normal,不然其它连接无法访问数据库。

Synchronous: 这个影响数据是否会实质写盘,实测设置为off没有任务影响。进程间数据依然是同步。这个会影响写入速度。

JournalMode:WAL 这个推荐就设置成WAL,具体不解释。 几种方式这种还是最好的。

delphi中如果一条写语句没有包装在事务中,则会自动发起一个事务。

sqlite锁定方式为文件锁,即当一个进程处于写锁中,即写入操作后,尚未提交。其它进程不可以执行写入操作。与具体写入哪个表无关。

总结在避免出现database is locked. 以下设置组合最好:

JounalMode:WAL

Synchronous:off|Normal

LockedMode:normal

SharedCache:true

TxOptions.isolation:xiSnapshot.

UpdateOptions.lockWait=true

Busytimeout:10秒。

同时操作时注意事务时间尽可能短,不要超过10秒。

基本上以上设置后,不会出现database is locked错误了。

By default, all SQLite driver settings are set for the high-performance single connection access to a database in a stable environment. The PRAGMA command allows you to configure SQLite. Many FireDAC SQLite driver parameters correspond to the pragmas. Additionally, SQLiteAdvanced allows you to specify multiple pragmas separated by ';' as a single connection parameter.

The additional SQLite use cases are:

No Application specifics Description
1 Reading large DB. Set CacheSize to a higher number of pages, which will be used to cache the DB data. The total cache size will be CacheSize * <db page size>.
2 Exclusive updating of DB. Consider to set JournalMode to WAL (more).
3 Long updating transactions. Set CacheSize to a higher number of pages, that will allow you to run transactions with many updates without overloading the memory cache with dirty pages.
4 A few concurrent updating processes. Set LockingMode to Normal to enable shared DB access. Set Synchronous to Normal or Full to make committed data visible to others. Set UpdateOptions.LockWait to True to enable waiting for locks. Increase BusyTimeout to raise a lock waiting time. Consider to set JournalMode to WAL.
5 A few concurrent updating threads. See (4). Also set SharedCache to False to minimize locking conflicts.
6 A few concurrent updating transactions. See (4) or (5). Also set TxOptions.Isolation to xiSnapshot or xiSerializible to avoid possible transaction deadlocks.
7 High safety. Set Synchronous to Full to protect the DB from the committed data losses. Also see (3). Consider encrypting the database to provide integrity.
8 High confidentiality. Encrypt database to provide confidentiality and integrity.
9 Development time. Set LockingMode to Normal to enable simultaneous use of the SQLite DB in the IDE and a debugged program.

事务可以是延迟的、立即的或排他的。默认事务行为是 DEFERRED。

DEFERRED 意味着事务直到第一次访问数据库才真正开始。在内部,BEGIN DEFERRED 语句仅在数据库连接上设置一个标志,该标志关闭通常在最后一条语句完成时发生的自动提交。这会导致自动启动的事务一直持续到显式 COMMIT 或 ROLLBACK 或直到由错误或 ON CONFLICT ROLLBACK 子句引发回滚。如果 BEGIN DEFERRED 之后的第一条语句是 SELECT,则启动读取事务。如果可能,后续的写入语句会将事务升级为写入事务,或者返回 SQLITE_BUSY。如果 BEGIN DEFERRED 之后的第一条语句是写入语句,则启动写入事务。

IMMEDIATE 导致数据库连接立即开始新的写入,而无需等待写入语句。如果另一个写入事务已在另一个数据库连接上处于活动状态,则 BEGIN IMMEDIATE 可能会因SQLITE_BUSY而失败。

EXCLUSIVE 与 IMMEDIATE 相似之处在于立即启动写入事务。EXCLUSIVE 和 IMMEDIATE 在WAL 模式下是相同的,但在其他日志模式下,EXCLUSIVE 会阻止其他数据库连接在事务进行时读取数据库。

插个题外话:在firedac连接mysql时,可以直接设置TXOptions.isolation = xiReadCommitted 就可以了。这个是记录级锁。 一个事务修改一个条记录时,不影响其它进程的对其它表或其它记录的的更新。

xiReadCommitted:脏读。处于事务中时,读不到其它表的更新,但写数据时是受其它事务影响的,按数据库当前最新数据进行的。

Delphi FireDAC SQLite “database is locked“ 解决办法相关推荐

  1. delphi xe “[FIREDAC][PHYS][SQLITE] DATABASE IS LOCKED”错误

    在对sqlite数据进行插入操作时,提示 "[FIREDAC][PHYS][SQLITE] DATABASE IS LOCKED"错误 在FDConnection1中的 Locki ...

  2. SQLite数据库database is locked解决

    开发语言C# 主要通过配置数据库连接字符串解决 关键语句:Journal Mode=WAL: /// <summary> /// 数据库连接字符串 /// </summary> ...

  3. sqlite database is locked 问题解决方案

    这两天在项目中用大强度大频率的方法测试时遇到sqlite报database is locked的问题, 分析下来原因是sqlite对数据库做修改操作时会做(文件)锁使得其它进程同一时间使用时会报该错误 ...

  4. discuz mysql data_终于找到Discuz! Database Error终极解决办法了!

    本帖最后由 FU81 于 2014-8-27 02:32 编辑 Discuz! Database Error (2003) notconnect PHP Debug No.        File  ...

  5. Delphi 7启动后出错的解决办法

    最近在WINDOWS SERVER 2019上装Delphi7,安装后打开报如下错: Unable to rename 'C:\Program Files (x86)\Borland\Delphi7\ ...

  6. initializing mysql database:_安装MySQL 出现initializing database安装失败解决办法

    首先卸载MySQL: 1)停止MySQL服务,ctrl+R打开cmd命令界面,输入net stop mysql,出现已停止则成功 2)删除mysql server服务.还是cmd命令界面,输入sc d ...

  7. sqlite 中出现的database table is locked 解决办法

    现象:删除数据的时候只有先查看过数据就会出现删除失败.跟网上说的事务上锁是有关系的.. 昨天忙活了一天,慢天的找原因... 代码     sqlite3_stmt *stat;//写二进制数据时要用的 ...

  8. Win7 64bit系统下未能加载文件或程序集“System.Data.SQLite”的另一解决办法

    在http://www.cnblogs.com/downcom/archive/2009/10/26/1590120.html中我曾给出一种解决方法,但这种方法在本地用64位系统开发程序,但服务器却是 ...

  9. Oracle 中ORA-28000: the account is locked解决办法

    在没有navicat,只有cmd应用程序的条件下,在密码输入多次都出现 the account is locked用户账号被锁的问题,请看这里: 首先,出现ORA-28000: the account ...

  10. 使用phpStudy加sqli-labs时出现“Unable to connect to the database: security”的解决办法

    1.手动创建security数据库并导入sql-labs.sql PS D:\phpstudy_pro\Extensions\MySQL5.1.60\bin> .\mysql.exe -uroo ...

最新文章

  1. 潜在狄利克雷分配(LDA,Latent Dirichlet Allocation)模型(二)
  2. 动态规划 4、基础背包问题总结(多重背包与多重背包的转化)
  3. mysql 严格模式_MySQL 开启/关闭 严格模式(Strict Mode)
  4. si_meminfo获取当前系统物理内存使用情况
  5. 丰巢拒绝放弃超时收费:不想用,可以别用
  6. 嵌入式工程师需不需要学java_嵌入式开发工程师需要具备哪些素质和技能基础?...
  7. python图片标记_python提取那些被“标记”照片的实例详解
  8. 如何把桌面计算机和回收站隐藏,如何隐藏电脑桌面回收站?隐藏桌面回收站方法介绍...
  9. 传染病研究-非靶向下一代宏基因组测序(mNGS)分析
  10. QQ等App每天自启百次;​李国庆直播拍卖午餐时间1小时;苹果提交认证9款新手机 | EA周报...
  11. html中背景条纹效果,CSS3做出条纹大背景
  12. autojs微信运动自动点赞
  13. STM32单片机初学心得
  14. Spark面试题(二)
  15. 手机 APP 的卖货界面
  16. 参加AKM DSP芯片代理培训
  17. 我工作这十年-中国在崛起
  18. 如何给出Bayesian Estimation模型W的分布?
  19. 192本软件著作用词分析(二)
  20. 伪睡眠排序(c++实现)

热门文章

  1. 图片背景处理技巧快来学学
  2. uniapp-手写三级地区选择实现
  3. 【2G模组Air202开发】Lua脚本编程实现MQTT协议连接Tlink平台(二)
  4. 站班汇报 水印 加相册插件
  5. 3d公式算法计算机,最新3d万能计算定胆公式来了
  6. 计算机组装内存条安装,笔记本电脑内存条的正确安装方法
  7. 谁说文艺青年开花店必亏,我用3年时间挣了20万
  8. Relational Knowledge Distillation解读
  9. nacl溶解度_氯化钠溶解度
  10. 华为P7开启USB调试方法