sqlite數據庫,同一時刻允許多個進程/線程讀,但同一時刻只允許一個線程寫。在操行寫操作時,數據庫文件被瑣定,此時任何其他讀/寫操作都被阻塞,如果阻塞超過5秒鍾(默認是5秒,能過重新編譯sqlite可以修改超時時間),就報"database is locked"錯誤。
如何處理
1 默認 5 秒是很長的時間了,找出具體是哪些業務執行會造成超時 5 秒
2 調用方自己再加鎖
3 修改 busy timeout 時間
這個只能是減少問題發生的概率,具體方法如下:
設置 busy timeout 的 API
sqlite 原始 API
devart 庫的 API
C# 版本
設置 CommandTimeout
即可,單位為秒。
Database errors - Microsoft.Data.Sqlite | Microsoft Docs
c# - Linq-to-SQL Timeout - Stack Overflow
Timeout issue · Issue #1668 · linq2db/linq2db
其它參考
python - OperationalError: database is locked - Stack Overflow