【问题标题】:Simultaneous data access from different threads来自不同线程的同时数据访问
【发布时间】:2017-05-29 12:55:42
【问题描述】:

您好,我正在开发一个 WinForms 应用程序,它使用 LocalDb 和 EF 进行数据访问。 到目前为止,我的 WinForms 应用程序中的数据库访问一次只执行一次,只需调用:

using (var context = new EfDbContext())
{
     // do something on context entities
}

在需要时。

现在我面临一个新要求 - 我需要创建一个额外的后台服务,用于定期从位于某些 FTP 服务器上的文件中获取数据,然后 - 在此 SQL LocalDb 中更新/插入新数据。

我想要实现的是为 WinForms 应用程序和这个新的后台应用程序(服务)授予对 SQL LocalDb 数据的同时访问权限,以便用户可以查看 Db 中的数据(在 WinForm 应用程序中) ),而数据的更新是在后台(由服务)执行的。

我想省略互相阻塞的资源。

可以做到(以及如何做到)? 谢谢!

更新:我忘了提到将从 ftp 文件读取然后插入数据库的数据集可能非常大~20-50k 条记录,每条记录由十进制字段、DateTimeOffset 字段和少量 Int32 字段组成.

【问题讨论】:

  • 有什么尝试了吗?例如,如果它已经工作了就尝试过?
  • SQL Server 本质上是一个多用户 RDBMS。这包括 LocalDB。事实上,你很难找到比 SQL Server 处理并发性更好的东西。
  • @FelixD。我还没有尝试任何东西,我正在阅读它,只需要知道它是否可以实现,或者我需要切换到 SqlServer 并付费。
  • 不。 所有 版本的 SQL Server 都可以在并发方面正常工作。 LocalDB 使用与 SQL Server Enterprise 完全相同的引擎——只是对它可以使用的系统资源有限制。您可能会对 SQLite 等小型数据库系统感到困惑。默认情况下,LocalDB 的配置方式使其难以从远程计算机访问,但这是一个完全不同的问题。您可能需要 Express(仍然免费,仍然并发)。
  • 可以,但不是必须的。快照隔离在没有锁定的情况下实现了并发,但它不会让冲突消失——它只会把它们变成你必须重试的失败。作为第一种方法,默认的READ COMMITTED 隔离级别适用于大多数应用程序。

标签: c# sql-server multithreading winforms entity-framework


【解决方案1】:

只需使用它,暂时不用担心并发性。 SQL Server 广泛用于高度并发的应用程序,如 ASP.NET Web 应用程序,您的示例并不是那么特别。使用带有写操作的事务时,阻塞可能是一个问题。但是有很多Transaction isolation levels 可以解决这个问题,我认为现在与你的任务无关

【讨论】:

    猜你喜欢
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多