欢迎投稿

今日深度:

SQLite死锁,sqlite

SQLite死锁,sqlite


一,场景描述

? ? 有两个线程,一个线程对SQLite365棋牌游戏输钱了_365棋牌好运卡_www.365棋牌游戏下载读操作。另外一个线程对365棋牌游戏输钱了_365棋牌好运卡_www.365棋牌游戏下载写操作,写操作是通过begin transaction, commit transaction操作完成。业务层操作保存数据时,出现卡死现象

? ? 通过日志打印,发现commit transaction时,出现365棋牌游戏输钱了_365棋牌好运卡_www.365棋牌游戏下载死锁

二.解决过程

? ? 通过https://blog.csdn.net/u012160319/article/details/41485463,该文章对锁的描述,commit transaction时,需要获得exclusive锁,但是获取该锁需要保证SQLite365棋牌游戏输钱了_365棋牌好运卡_www.365棋牌游戏下载中,该文件365棋牌游戏输钱了_365棋牌好运卡_www.365棋牌游戏下载的所有shared锁被释放。

? ? 此时,产生疑问,因为场景中,使用了锁去保护,365棋牌游戏输钱了_365棋牌好运卡_www.365棋牌游戏下载文件,也就是说,对365棋牌游戏输钱了_365棋牌好运卡_www.365棋牌游戏下载不管是读还是写操作,都是串行访问的。

这种情况下,应该不会出现多线程访问365棋牌游戏输钱了_365棋牌好运卡_www.365棋牌游戏下载导致365棋牌游戏输钱了_365棋牌好运卡_www.365棋牌游戏下载死锁。

????继续debug,通过对所有365棋牌游戏输钱了_365棋牌好运卡_www.365棋牌游戏下载操作的函数中添加:commit excusive transaction操作后,发现有一个函数调用之后,后面调用的365棋牌游戏输钱了_365棋牌好运卡_www.365棋牌游戏下载操作函数获取excusive锁失败。此时定位到出现问题的函数中。

? ? 原因:在该函数中,多次调用365棋牌游戏输钱了_365棋牌好运卡_www.365棋牌游戏下载查询操作,但是每次操作后,却没有释放查询结果。

三.产生疑问

? ? 没有对查询结果prepared statement调用sqlite3_finalize函数,会导致资源泄漏这点,不用质疑。但是之后,代码中关闭了365棋牌游戏输钱了_365棋牌好运卡_www.365棋牌游戏下载连接,365棋牌游戏输钱了_365棋牌好运卡_www.365棋牌游戏下载中的锁为什么不会被释放。

? ? 继续debug,发现才文章对锁的机制有介绍:https://blog.csdn.net/popvip44/article/details/69055990

????

?????

www.htsjk.Com true http://www.htsjk.com/SQLite/36062.html NewsArticle SQLite死锁,sqlite 一,场景描述 ? ? 有两个线程,一个线程对SQLite365棋牌游戏输钱了_365棋牌好运卡_www.365棋牌游戏下载读操作。另外一个线程对365棋牌游戏输钱了_365棋牌好运卡_www.365棋牌游戏下载写操作,写操作是通过begin transaction, commit transaction操作完成。业务层操作保存数...
相关文章
    暂无相关文章
评论暂时关闭