欢迎投稿

今日深度:

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操作完成。业务层操作保存数...
相关文章
    暂无相关文章
评论暂时关闭