小代码大BUG,记解决Sqlite3死锁问题

随时记录学习,工作中遇到的点滴"大问题,小问题"

今天遇到了一个问题,sqlite3提示数据库死锁,无法更新,奇怪的是可以插入,可以查询,可以删除,就是不可以更新,

经过近几个小时的排查,最终找到了问题的根源,

有一点点想法,就是问题大不大,关键看你懂不懂,或者说,问题解决没解决,如果没解决,那么就是个大问题

如果问题解决了,那么就是小问题,而且吧,这个小问题或大问题的定义因人而异,而经验而异,

在有些人眼里就是小儿科,在另外一些人眼里却是高深莫测的大问题,废话可真多啊,呵呵,其实就是一行代码引发的

是这样的,在业务逻辑层有一个Existed(实体 实例)方法,为了图方便当时的代码是这样的写的,当然现在意识到这样写的问题了,

近一点,先看错误的代码

 

ContractedBlock.gif ExpandedBlockStart.gif 错误代码,不可复制
//执行查询
            try {
                
return db.ExecuteReader( CommandType.Text, sql, parameters ).HasRows;
            } 
catch( Exception exp ) {
                
throw exp;
            }

 

有发现问题吗?对了,返回的DataReader没有释放,直接导致了sqlite的死锁!

现修改如下

 

ContractedBlock.gif ExpandedBlockStart.gif 第一次修改后的正确的代码
//执行查询
            try {
                
using( DbDataReader reader = db.ExecuteReader( CommandType.Text, sql, parameters ) ) {
                    
return reader.HasRows;
                }
            } 
catch( Exception exp ) {
                
throw exp;
            }

 

现在可以正常更新了~死锁问题如此产生,必将如此结束了

现在再来想一想,这个问题算大问题还是小问题呢?

第一次听到sqlite死锁时你认为它是个大问题还是个小问题呢? 

 

记录学习中的点点滴滴,一次书写,终生享用,人人为我,我为人人

转载于:https://www.cnblogs.com/kkun/archive/2009/02/18/1393471.html

本次更新对于支持库来说,接口改动不大,模块版的话是尽量和支持库接口保持一致,所以对于以前的模块接口可能改动就大了。 要解决多线程问题,主要是对sqlite3的锁机制进行了解,和事务有密切的关系。本次更新的版本在开始事务时,增加了一个 事务锁状态 的参数。 拿简单的话来描述就是 开始事务 时如果 设置了 事务锁状态_ 立即 参数,那么这个时候其他线程的连接就不能写操作了,但是可以读操作,但是在提交事务时也要等待所有读操作完成了才能提交。 设置了 事务锁状态_ 独占 参数,那么这个时候其他线程的连接读写都不可以了。 在等待的时候就处于繁忙状态,我们可以设置 数据库.繁忙超时 ()来设置等待时间。 还有种情况还是会 死锁 ,就是录集没有关闭,而且这次更新的支持库和模块都是必须 手动关闭录集 的,所以一定注意。 当然多进程和多线程是一个道理,具体操作看例子。 esqlite3 V1.1 相对于1.0的更新 1、增加了全局命令: S3互斥体进入 S3互斥体退出 S3聚合上下文 S3取数据库自上下文 2、增加了zySqlite数据库 命令 繁忙超时 繁忙处理 取文件名 是否只读 取互斥体 是否自动提交 进度处理 取下一录集 取总影响行 3、增加了 zySqlite录集 命令 是否繁忙 是否只读 取数据库句柄 取行数 4、数据库.开始事务() 增加了 事务锁状态 参数,此参数在多线程中非常重要。 5、录集必须手动关闭,任何内部方法都不再自动关闭。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值