0

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

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

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

  • 查看数据库,如果 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 个以上客户端的生产环境中,因此在开发时很难调试。

任何帮助将不胜感激!

4

1 回答 1

1

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

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

http://sqlite.org/whentouse.html

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

一个好的经验法则是避免在同一个数据库将被直接访问(没有介入的应用程序服务器)并同时从网络上的多台计算机访问的情况下使用 SQLite。

于 2017-04-26T08:05:30.427 回答