0

我正在使用帶有SignalR的EFCore SQLite。EF Core + SignalR多客戶端:「無法回滾 - 沒有事務處於活動狀態」

當有許多客戶在同一時間連接,數據庫不能改變(插入/更新)了,這個異常拋出:「無法恢復 - 無成交活躍」

。客戶查詢連接包含其信息的參數,則:

  • 查看數據庫,如果clientName存在,則更新其信息。否則,添加新的。
  • 連接後,客戶端名稱調用GetData(),返回所有客戶端的信息等等。
  • 大約有100個客戶端同時連接。

日誌:

An exception occurred in the database while iterating the results of a query. 
System.InvalidOperationException: A second operation started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe. 

然後

Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 5: 'database is locked'. 

之後,當我嘗試插入或更新的東西:

Cannot rollback - No transaction is active 

有沒有解決辦法?這隻發生在有50個客戶端+的生產環境中,因此開發時很難進行調試。

任何幫助將不勝感激!

回答

1

SQLite並不打算用作服務器數據庫。這是因爲只能同時執行一次插入/更新。

這是更好地使用SQL Server,MySQL和Postgre或一些其他的SQL數據庫服務器

http://sqlite.org/whentouse.html

如果有通過網絡發送SQL到同一個數據庫 許多客戶端程序,然後使用客戶端/服務器數據庫引擎而不是 SQLite。 SQLite將通過網絡文件系統工作,但由於與大多數網絡文件系統相關的延遲,性能不會很好。另外,文件鎖定邏輯在許多網絡文件系統實現中(在Unix和Windows上)都是有問題的。如果文件鎖定不能 正常工作,兩個或多個客戶端可能會嘗試同時修改相同數據庫的相同部分 ,從而導致損壞。 因爲這個問題是由底層文件系統 實現中的錯誤引起的,所以SQLite沒有辦法阻止它。

一個好的經驗規則是爲了避免在將 相同的數據庫將直接從多臺計算機通過網絡 訪問(沒有中間 應用服務器),並同時情況使用SQLite。

相關問題