【发布时间】: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