求助,关于Sqlite报databasdevice is lockedd的问题

SQLite指南(6)-处理database is locked的方法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
SQLite指南(6)-处理database is locked的方法
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢2017年2月 总版技术专家分月排行榜第三
2017年5月 .NET技术大版内专家分月排行榜第一2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。求助!关于Sqlite报错“database is locked”的问题?-CSDN论坛
求助!关于Sqlite报错“database is locked”的问题?
百度上都说是多线程同时写入数据库时造成的锁问题,我分析发现都是执行了事务后再执行其他数据库的操作就有机率报“database&is&locked”这个错,代码:
&&public&static&void&UpdateWebTran(string[]&key,&string[]&value,&string[]&id)
&&&&&&&&&&&&lock&(_Obj)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&SQLiteParameter[]&para&=&{&new&SQLiteParameter("@value"),&new&SQLiteParameter("@id"),&};
&&&&&&&&&&&&&&&&SQLiteConnection&conn&=&new&SQLiteConnection(Constring);
&&&&&&&&&&&&&&&&SQLiteCommand&cmd&=&new&SQLiteCommand(conn);
&&&&&&&&&&&&&&&&if&(conn.State&!=&ConnectionState.Open)&conn.Open();
&&&&&&&&&&&&&&&&SQLiteTransaction&tran&=&conn.BeginTransaction(IsolationLevel.Unspecified);
&&&&&&&&&&&&&&&&for&(int&j&=&0;&j&&&key.L&j++)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&string&sql&=&string.Format("update&weblist&set&{0}=@value&where&id=@id",&key[j]);
&&&&&&&&&&&&&&&&&&&&para[0].Value&=&value[j];
&&&&&&&&&&&&&&&&&&&&for&(int&i&=&0;&i&&&id.L&i++)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&para[1].Value&=&id[i];
&&&&&&&&&&&&&&&&&&&&&&&&mandText&=&
&&&&&&&&&&&&&&&&&&&&&&&&cmd.Parameters.AddRange(para);
&&&&&&&&&&&&&&&&&&&&&&&&cmd.ExecuteNonQuery();&
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&try
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&mit();
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&catch&(Exception&ex)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&throw&
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&tran.Dispose();
&&&&&&&&&&&&&&&&cmd.Dispose();
&&&&&&&&&&&&&&&&conn.Close();
&&&&&&&&&&&&}
我估计是有其他线程正在对数据库进行操作,同时再执行这个事务的时候就会造成的锁问题。
请问怎么解决啊?或者怎么让执行事务的时候不让其他线程去操作数据库呢?谢谢
已经解决了,sqlite只支持一写多读,同时只能写入一个,而读可以多个同时进行,如果读写同时进行,就会报这样的错,在机子配置比较差的时候这种情况很难出现,但好一点的就会出现了,而且机子越好,报错的机率越大,因为CPU执行得快,同时读写的机率也就大了。解决方法是把数据库连接做成单例加锁,不过这样在多线程的时候因为锁会变得很慢,暂时还没找到其他方法,好像基本无解,还有其他可行方法的告诉我一下。
大家帮我推荐个数据库吧http://bbs.csdn.net/topics/
不用sqlite了,好郁闷
sqlite是用做嵌入式或是移动端开发的,这类产品中基本上都是单线程执行。不适合用在多线程并发情况下。
引用&1&楼&qaz952727&的回复:已经解决了,sqlite只支持一写多读,同时只能写入一个,而读可以多个同时进行,如果读写同时进行,就会报这样的错,在机子配置比较差的时候这种情况很难出现,但好一点的就会出现了,而且机子越好,报错的机率越大,因为CPU执行得快,同时读写的机率也就大了。解决方法是把数据库连接做成单例加锁,不过这样在多线程的时候因为锁会变得很慢,暂时还没找到其他方法,好像基本无解,还有其他可行方法的告诉我一下。
是有这种问题,sqlite处于写的状态,新的写请求将不会得到响应,也就是出现“database&is&locked"。
处于写状态,读请求应该会响应的吧?!
在一个写请求未完成之前,其他写请求排队。
引用&3&楼&lifeilin6671&的回复:sqlite是用做嵌入式或是移动端开发的,这类产品中基本上都是单线程执行。不适合用在多线程并发情况下。
那有其他的数据库推荐下没
引用&5&楼&qaz952727&的回复:Quote: 引用&3&楼&lifeilin6671&的回复:
sqlite是用做嵌入式或是移动端开发的,这类产品中基本上都是单线程执行。不适合用在多线程并发情况下。
那有其他的数据库推荐下没
SQL&Server&2012&Express。
不过我使用&MongoDB。
如果你想使用嵌入式数据库,可以使用&SQL&Server&Compact(通过你的vs使用&NuGet&下载即可)。
引用&6&楼&sp1234&的回复:Quote: 引用&5&楼&qaz952727&的回复:
Quote: 引用&3&楼&lifeilin6671&的回复:
sqlite是用做嵌入式或是移动端开发的,这类产品中基本上都是单线程执行。不适合用在多线程并发情况下。
那有其他的数据库推荐下没
SQL&Server&2012&Express。
不过我使用&MongoDB。
如果你想使用嵌入式数据库,可以使用&SQL&Server&Compact(通过你的vs使用&NuGet&下载即可)。
谢谢回答,我的软件是给客户使用的,sql&server太大型了,客户机上安装不方便,芒果数据库是非关系数据库,这个没怎么了解过,如果换他的话改动的代码应该比较大吧,除了SQL&Server&Compact,还有其他没
即使是一小步也想与你分享用firedac连接SQLITE数据库,空间tdbedit绑定字段name,如下语句修改其值时报错。procedure&TForm1.Button3Click(Sender:&TObject);begin&fdquery.E&fdquery.FieldByName('name').AsString:='test2';&fdquery.&&&//执行到这里报错&[FireDAC][Phys][SQLite]&ERROR:&database&is&locked.&换成refresh也一样。
设置SQLITE的连接参数&LockingMode=normal&解决了
阅读(...) 评论()温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
荆楚大地,长江以北,故名之楚江北。
A dwarf climbing a ladder-becoming higher with each step.
A good way for a dwarf to get taller is to climb a ladder.
Each step will make him look more exalted.
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(146)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_087066',
blogTitle:'【转】sqlite报database is locked的问题',
blogAbstract:'这两天在项目中用大强度大频率的方法测试时遇到sqlite报database is locked的问题,分析下来原因是sqlite对数据库做修改操作时会做(文件)锁使得其它进程同一时间使用时会报该错误(也就是SQLITE_BUSY),但如果仅是多进程或多线程查询sqlite是支持的。(也有可能是做sql开启事务查询等发生异常,数据库没有关闭,然后再去打开就锁定了)解决方法有:1。使用进程或线程间的同步机制以避免同时操作;如用信号量,互斥锁等(pthread_mutex_lock,pthread_mutex_unlock),如果你的项目工程较大要求较高的话建议用此方法自行封装函数处理同步2。使用sqlite提供的两个busy handler函数,但对于一个连接来说,只能有一个busy handle,两个函数会相互影响,设置一个的同时会清除另一个,应根据需要来选择。',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:1,
publishTime:0,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'楚江北:\n荆楚大地,长江以北,故名之楚江北。\n\n博名:\nA dwarf climbing a ladder-becoming higher with each step.\nA good way for a dwarf to get taller is to climb a ladder. \nEach step will make him look more exalted.',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 is already locked 的文章

 

随机推荐