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

相关文章

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

SQLite3命令行工具最佳实践指南

《SQLite3命令行工具最佳实践指南》SQLite3是轻量级嵌入式数据库,无需服务器支持,具备ACID事务与跨平台特性,适用于小型项目和学习,sqlite3.exe作为命令行工具,支持SQL执行、数... 目录1. SQLite3简介和特点2. sqlite3.exe使用概述2.1 sqlite3.exe

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal