EF Core + SignalR多客户端:“无法回滚 - 没有事务处于活动状态”
问题描述:
我正在使用带有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个客户端+的生产环境中,因此开发时很难进行调试。
任何帮助将不胜感激!
答
SQLite并不打算用作服务器数据库。这是因为只能同时执行一次插入/更新。
这是更好地使用SQL Server,MySQL和Postgre或一些其他的SQL数据库服务器
http://sqlite.org/whentouse.html
如果有通过网络发送SQL到同一个数据库 许多客户端程序,然后使用客户端/服务器数据库引擎而不是 SQLite。 SQLite将通过网络文件系统工作,但由于与大多数网络文件系统相关的延迟,性能不会很好。另外,文件锁定逻辑在许多网络文件系统实现中(在Unix和Windows上)都是有问题的。如果文件锁定不能 正常工作,两个或多个客户端可能会尝试同时修改相同数据库的相同部分 ,从而导致损坏。 因为这个问题是由底层文件系统 实现中的错误引起的,所以SQLite没有办法阻止它。
一个好的经验规则是为了避免在将 相同的数据库将直接从多台计算机通过网络 访问(没有中间 应用服务器),并同时情况使用SQLite。