sqlite3报错:database is locked

2024-05-12 17:28
文章标签 报错 database sqlite3 locked

本文主要是介绍sqlite3报错:database is locked,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述:

使用visual studio2022创建动态库,动态库中包含向sqlite3数据库插入数据的函数,在测试函数时偶尔出现database is locked的错误提示。

思路:

1、最开始以为是代码写的有问题,可能对于某些资源没有释放,经过检查后发现代码中某些情况下没有释放stmt,修改后重新测试依然没有解决问题。

2、后来根据locked想到了锁,那么是不是被程序中其他线程锁住了呢?很遗憾,我的程序是单线程的,并不是这个问题。

3、经过网上查询资料发现,依然有很大可能是被其他某个东西锁住了。不一定是线程,也许是其他进程,于是发现了我另一个软件(sqlite expert)打开数据库文件后一直在监听数据,时不时会更新数据。那么会不会是因为这个软件一直在监听数据导致的呢?但是很奇怪的是,这个软件只是读数据,而不会去写数据,真的是这个软件导致的问题吗?

问题原因

经过查询sqlite3的锁机制发现:sqlite3并不支持并发写,在某一时刻只能有一个连接去写数据。

sqlite3的锁包含五种状态:未加锁、共享锁、保留锁、未决锁、排他锁。

首先,当所有的连接都没有连接到数据库时,处于未加锁状态;

其次,当某个连接试图去读取数据库数据时,此时处于共享锁状态,此时依然允许其他连接申请共享锁;

接着,当某个连接试图去写数据时,需要申请保留锁,意味着该连接已经准备好写数据了(但还没写),此时依然允许有连接申请共享锁;

最后,试图写数据的连接需要获取写锁,由于sqlite3只允许一个线程写入数据,因此需要将保留锁升级成排他锁,从而写入数据。而当它试图升级为排它锁但还没获得时,则先将锁升级为未决锁,此时将不再允许有新的连接获得共享锁,当所有的已经获得共享锁的连接读取完数据释放共享锁后,此时试图写入数据的连接将未决锁升级成排它锁,从而写入数据。

总结

那么此时回看之前的问题,由于sqlite expert会时不时自动刷新数据,因此,当sqlite expert没有对数据进行刷新时,数据可以正常的插入数据库文件中,但是当sqlite expert刷新数据时,就会导致database is locked,因为只要有一个连接持有共享锁,都无法写入数据。这也是为什么偶尔该错误的原因。后来将sqlite expert换成了sqlite studio,sqlite studio不会自动刷新数据,需要手动点击刷新按钮才会刷新数据,因此用sqlite studio打开数据库文件并没有出现类似的问题(不要在连续插入数据时点击刷新数据的按钮,否则也会出现上述问题)。

这篇关于sqlite3报错:database is locked的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/983261

相关文章

MySQL中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

Mysql表如何按照日期字段的年月分区

《Mysql表如何按照日期字段的年月分区》:本文主要介绍Mysql表如何按照日期字段的年月分区的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、创键表时直接设置分区二、已有表分区1、分区的前置条件2、分区操作三、验证四、注意总结一、创键表时直接设置分区

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.