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表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

MySQL中优化CPU使用的详细指南

《MySQL中优化CPU使用的详细指南》优化MySQL的CPU使用可以显著提高数据库的性能和响应时间,本文为大家整理了一些优化CPU使用的方法,大家可以根据需要进行选择... 目录一、优化查询和索引1.1 优化查询语句1.2 创建和优化索引1.3 避免全表扫描二、调整mysql配置参数2.1 调整线程数2.

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL 数据库表与查询操作实战案例

《MySQL数据库表与查询操作实战案例》本文将通过实际案例,详细介绍MySQL中数据库表的设计、数据插入以及常用的查询操作,帮助初学者快速上手,感兴趣的朋友跟随小编一起看看吧... 目录mysql 数据库表操作与查询实战案例项目一:产品相关数据库设计与创建一、数据库及表结构设计二、数据库与表的创建项目二:员

MySQL实现多源复制的示例代码

《MySQL实现多源复制的示例代码》MySQL的多源复制允许一个从服务器从多个主服务器复制数据,这在需要将多个数据源汇聚到一个数据库实例时非常有用,下面就来详细的介绍一下,感兴趣的可以了解一下... 目录一、多源复制原理二、多源复制配置步骤2.1 主服务器配置Master1配置Master2配置2.2 从服

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Java报错:org.springframework.beans.factory.BeanCreationException的五种解决方法

《Java报错:org.springframework.beans.factory.BeanCreationException的五种解决方法》本文解析Spring框架中BeanCreationExce... 目录引言一、问题描述1.1 报错示例假设我们有一个简单的Java类,代表一个用户信息的实体类:然后,

MySQL 临时表创建与使用详细说明

《MySQL临时表创建与使用详细说明》MySQL临时表是存储在内存或磁盘的临时数据表,会话结束时自动销毁,适合存储中间计算结果或临时数据集,其名称以#开头(如#TempTable),本文给大家介绍M... 目录mysql 临时表详细说明1.定义2.核心特性3.创建与使用4.典型应用场景5.生命周期管理6.注

MySQL磁盘空间不足问题解决

《MySQL磁盘空间不足问题解决》本文介绍查看空间使用情况的方式,以及各种空间问题的原因和解决方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录查看空间使用情况Binlog日志文件占用过多表上的索引太多导致空间不足大字段导致空间不足表空间碎片太多导致空间不足临时表空间

MySQL进行分片合并的实现步骤

《MySQL进行分片合并的实现步骤》分片合并是指在分布式数据库系统中,将不同分片上的查询结果进行整合,以获得完整的查询结果,下面就来具体介绍一下,感兴趣的可以了解一下... 目录环境准备项目依赖数据源配置分片上下文分片查询和合并代码实现1. 查询单条记录2. 跨分片查询和合并测试结论分片合并(Shardin