EF Core + SignalR多客户端:“无法回滚 - 没有事务处于活动状态”

时间:2017-04-26 05:15:26

标签: asp.net-core signalr entity-framework-core database-concurrency

我正在使用带有SignalR的EFCore SQLite。

当有许多客户端同时连接时,数据库不能再更改(插入/更新),此异常抛出:“无法回滚 - 无活动事务”

客户端连接包含其信息的查询参数,然后:

  • 查看数据库,如果clientName存在,则更新其信息。否则,添加新的。
  • 连接后,客户端名称调用GetData(),返回所有客户端信息等...
  • 大约有100个客户端同时连接。

日志:

String queryURL = "<myURL>";
HttpGet getMethod = new HttpGet(queryURL);
CloseableHttpClient cl = null;
CloseableHttpResponse response = null;
cl = getDefaultHttpClient();
response = cl.execute(getMethod);

然后

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'.

有解决方法吗?这只发生在50个客户端+的生产中,因此在开发时很难调试。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

SQLite并不打算用作服务器数据库。这是因为只能同时执行一次插入/更新。

最好使用SQL Server,MySQL,Postgre或其他一些sql数据库服务器

http://sqlite.org/whentouse.html

  

如果有许多客户端程序将SQL发送到同一个数据库   通过网络,然后使用客户端/服务器数据库引擎而不是   SQLite的。 SQLite将在网络文件系统上工作,但由于   与大多数网络文件系统相关的延迟,性能不会   太棒了此外,文件锁定逻辑在许多网络文件系统中都是错误的   实现(在Unix和Windows上)。如果文件锁定没有   如果工作正常,两个或多个客户端可能会尝试修改同一部分   同一个数据库同时导致腐败。   因为此问题是由底层文件系统中的错误引起的   实现时,SQLite无法阻止它。

     

一个好的经验法则是避免在情况下使用SQLite   将直接访问相同的数据库(无需干预   应用程序服务器)同时来自多台计算机   网络