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

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

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

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

查看: 17793|回复: 8

[其他] 求助!关于Sqlite报database is locked的问题

[复制链接]
发表于 2014-11-10 10:10:48 | 显示全部楼层 |阅读模式
50金钱
百度上都说是多线程同时写入数据库时造成的锁问题,我分析发现都是执行了事务后再执行其他数据库的操作就有机率报“database is locked”这个错,代码:
[C#] 纯文本查看 复制代码
  public static void UpdateTableTran(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.Serializable);
                for (int j = 0; j < key.Length; j++)
                {
                    string sql = string.Format("update mytable set {0}=@value where id=@id", key[j]);
                    para[0].Value = value[j];
                    for (int i = 0; i < id.Length; i++)
                    {
                        para[1].Value = id[i];
                        cmd.CommandText = sql;
                        cmd.Parameters.AddRange(para);
                        cmd.ExecuteNonQuery(); 
                    }
                }
                try
                {
                    tran.Commit();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                tran.Dispose();
                cmd.Dispose();
                conn.Close();
            }
        }


我估计是有其他线程正在对数据库进行操作,同时再执行这个事务的时候就会造成的锁问题。
请问怎么解决啊?怎么让执行事务的时候不让其他线程去操作数据库呢?谢谢



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2014-11-10 10:11:29 | 显示全部楼层
@站长苏飞 飞哥帮忙看看
回复

使用道具 举报

发表于 2014-11-10 10:20:30 | 显示全部楼层
为什么要用事务,不就是一条Sql语句吗?从这段代码上看,这是“没事找事”这是逼程序上锁啊。
回复

使用道具 举报

 楼主| 发表于 2014-11-10 12:23:11 | 显示全部楼层
站长苏飞 发表于 2014-11-10 10:20
为什么要用事务,不就是一条Sql语句吗?从这段代码上看,这是“没事找事”这是逼程序上锁啊。

不好意思,犯了个低级错误,已经改过来了,但还是报database is locked这个错
在执行ExecuteNonQuery();或者SQLiteDataAdapter.Fill(table)的时候报,调用这两个函数的是不同的线程,ExecuteNonQuery已经加了锁,SQLiteDataAdapter.Fill(table)不知咋加?
回复

使用道具 举报

发表于 2014-11-10 13:09:55 | 显示全部楼层
多线程直接这样就行了lock(obj)
{
//语句
}
回复

使用道具 举报

发表于 2014-11-11 14:22:40 | 显示全部楼层
路过学习学习
回复

使用道具 举报

发表于 2014-11-13 12:42:50 | 显示全部楼层
5楼正解,顶
回复

使用道具 举报

 楼主| 发表于 2014-11-13 19:20:57 | 显示全部楼层
已经解决了,方法是把数据库连接做成单例加锁,但还是有机率出错的,只是减少了很多,但在多线程的时候效率就非常非常低了,打算换数据库了
回复

使用道具 举报

发表于 2015-9-8 17:10:33 | 显示全部楼层
sandy1231 发表于 2014-11-13 19:20
已经解决了,方法是把数据库连接做成单例加锁,但还是有机率出错的,只是减少了很多,但在多线程的时候效率 ...

lock 本来就影响效率。
回复

使用道具 举报

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

本版积分规则

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

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

© 2014-2021

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