情况是这样的,因为公司产品需要,写了一个多线程抽取本地sqlite的的方法。
详情不表,之前使用也一直成功。
直到本次更新,需要检测老客户的本地sqlite表中是否有一个字段,如果没有则添加该字段,且update这个字段的值。
然后后面接正常的遍历注册表添加到sqlite的过程。
就是这里,频繁的报错了,一开始把加字段放在前面,把插入放在后面。然后就会发现,字段能正常加,但在表中有数据的情况下,如果再执行插入则会提示database is locked。
调试,发现,就算字段已经存在了,没有执行加字段,执行插入数据时,还是会提示database is locked。
调试*2,清空表内数据,正常插入数据,正常。
调试*2,删除表内一条记录,已有字段,执行插入,提示database is locked。
调试了一下午,百度了各种方案,包括lock,using,Monitor.Enter(obj)。
无效,于是最后想到了顺序问题,把已有字段情况下,先执行插入,后执行检测字段。插入正常。
于是联想到之前sqlite的特性,多读单写,没想到自己会栽在这里。(之前的加字段和插入是写了两个using的)
于是合并,同一个using下多读多写,反复横跳,正常,无报错。
贴部分代码吧……后人勿要再触发同样的错误了。
lock (lockcx)
{
using (SQLiteConnection con = new SQLiteConnection(DB_PATH))
//using (SQLiteConnection con = SqliteConn.GetInstance().GetConnection(DB_PATH))
{
con.Open();
//richTextBox1.Text += "3333\r\n";
sqlStr = "Select * From MAIN.[upt