http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 3003|回复: 6

[咨询站长] 仍然还是关于Sqlite报database is locked错误的问题,想请飞哥分析下原因

[复制链接]
发表于 2015-9-8 08:46:49 | 显示全部楼层 |阅读模式
本帖最后由 我是MT 于 2015-9-9 15:35 编辑

搜了下本论坛的相关主题,http://www.sufeinet.com/thread-10495-1-1.html 。这位兄弟也是遇到类似的问题。数据库被锁住了。

我不知道这是不是由于多线程操作导致的sqlite被锁。
我的情况和上面这位兄弟的情况唯一相同的地方可能是,2个不同的线程操作sqlite。

From1 主线程,    Form1中有个Timer1 。Timer1开启的时候是不是运行在另外一个线程里面?

Timer1_Tick里面,首先我调用了From1.cs里面的方法查询数据库,返回字符串;判断这个字符串条件如果True,则再次连接数据库,写入数据。在写入的时候,报错,database is locked! 按理说,我这里不存在多线程啊。
小Q截图-20150908083410.png
上面这张图片是一个方法,下面图片是Timer1_Tick{....  } 中的代码。时钟事件中调用了上面的那个方法。时钟周期是5秒钟。
小Q截图-20150908083538.png

每次操作,我都打开了之后  就都关闭了数据库连接,为何还会出现这种被锁住的情况呢?而且我还发现有不少的人遇到了这种情况。按道理说.net或者C#已经是比较成熟了。对于处理sqlite真的只能够引用“System.Data.SQLite.dll”


追加 :

可能是timer的问题, 在同一时刻,timer1和timer2同时访问数据库,进行对同一个数据库同一个表格,同一个字段进行修改操作。

OK。搞来搞去还是自己通过思考解决了问题了。最后把读取数据和更新数据的代码全部放在一个线程中执行就不会报错了。
从一开始设计代码逻辑就有点太分散。不严密啊。


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2015-9-8 14:38:41 | 显示全部楼层
安我在5楼说的加锁不行吗?
 楼主| 发表于 2015-9-8 16:46:35 | 显示全部楼层
本帖最后由 我是MT 于 2015-9-8 16:48 编辑
站长苏飞 发表于 2015-9-8 14:38
安我在5楼说的加锁不行吗?

谢谢飞哥的提醒。我查到问题的来龙去脉,所以这里也同时补充下,方便论坛里面其他人。

搞C#手头有几本书方便很多,关于sqlite database is locked ,基本都是由于“多线程操作同一对象未同步”引起的。多线程同步的问题《C#本质论》第四版,第十九章 线程同步 。贴图:
IMG_1821.JPG


IMG_1823.JPG
IMG_1822.JPG

IMG_1824.JPG
在百度里面可以搜索到monitor  和 lock 的使用方法。


 楼主| 发表于 2015-9-8 18:08:54 | 显示全部楼层
本帖最后由 我是MT 于 2015-9-8 18:24 编辑
站长苏飞 发表于 2015-9-8 14:38
安我在5楼说的加锁不行吗?


小Q截图-20150908180056.jpg

发表于 2015-9-9 09:19:26 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-24 02:26

© 2014-2021

快速回复 返回顶部 返回列表