欢迎投稿

今日深度:

SQLite死锁,sqlite

SQLite死锁,sqlite


一,场景描述

? ? 有两个线程,一个线程对SQLite大乐透追加倍投多少钱读操作。另外一个线程对大乐透追加倍投多少钱写操作,写操作是通过begin transaction, commit transaction操作完成。业务层操作保存数据时,出现卡死现象

? ? 通过日志打印,发现commit transaction时,出现大乐透追加倍投多少钱死锁

二.解决过程

? ? 通过https://blog.csdn.net/u012160319/article/details/41485463,该文章对锁的描述,commit transaction时,需要获得exclusive锁,但是获取该锁需要保证SQLite大乐透追加倍投多少钱中,该文件大乐透追加倍投多少钱的所有shared锁被释放。

? ? 此时,产生疑问,因为场景中,使用了锁去保护,大乐透追加倍投多少钱文件,也就是说,对大乐透追加倍投多少钱不管是读还是写操作,都是串行访问的。

这种情况下,应该不会出现多线程访问大乐透追加倍投多少钱导致大乐透追加倍投多少钱死锁。

????继续debug,通过对所有大乐透追加倍投多少钱操作的函数中添加:commit excusive transaction操作后,发现有一个函数调用之后,后面调用的大乐透追加倍投多少钱操作函数获取excusive锁失败。此时定位到出现问题的函数中。

? ? 原因:在该函数中,多次调用大乐透追加倍投多少钱查询操作,但是每次操作后,却没有释放查询结果。

三.产生疑问

? ? 没有对查询结果prepared statement调用sqlite3_finalize函数,会导致资源泄漏这点,不用质疑。但是之后,代码中关闭了大乐透追加倍投多少钱连接,大乐透追加倍投多少钱中的锁为什么不会被释放。

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

????

?????

www.htsjk.Com true http://www.htsjk.com/SQLite/36062.html NewsArticle SQLite死锁,sqlite 一,场景描述 ? ? 有两个线程,一个线程对SQLite大乐透追加倍投多少钱读操作。另外一个线程对大乐透追加倍投多少钱写操作,写操作是通过begin transaction, commit transaction操作完成。业务层操作保存数...
相关文章
    暂无相关文章
评论暂时关闭