使用读取提交与 EF 和 SQL Server 长时间运行的事务
本文关键字:长时间 Server 运行 事务 SQL 读取 提交 EF | 更新日期: 2023-09-27 18:34:05
我在 WPF 胖客户端应用程序上使用 EF6.1 和 SQL Server,默认情况下,我使用我实例化的每个 DbContext 打开一个事务(除非另有说明,否则我提交它并在每个SaveChanges()
重新打开它(。这些事务的隔离级别为已提交读取 (IsolationLevel.ReadCommited
(。
默认情况下,我在每个"主视图"上打开一个新上下文(因此是一个新事务(。该应用程序是一种假MDI应用程序,每个MDI视图都将使用自己的DbContext
..."主视图"(每个 MDI 选项卡/窗口(可以包含其他辅助视图(考虑用于特定数据输入的小模式窗口等(,这些视图将与主视图中打开的上下文(和事务(共享相同的上下文(和事务(。我正在使用像UseCase -> Views -> ViewModels
这样的结构...通常,"用例"会打开一个DbContext
,并且可以生成多个视图,这些视图将共享它。这些辅助视图通常会在不提交事务的情况下调用SaveChanges()
,这就是为什么我想将它们放在首位。
我已经在实验室服务器上对单个用户进行了一些性能测试,似乎不存在任何差异(性能方面(,无论是在实例化上下文时打开事务,还是根本没有事务(除了 EF 默认打开的事务SaveChanges()
(。
我不是 SQL Server 专家,所以我想知道在具有该隔离级别的 SQL Server 上打开许多长时间运行的事务是否有任何影响(当应用程序由生产服务器上的多个用户使用时((我了解对其他隔离级别的影响可能会锁定读取,但事实并非如此(。我在提交事务时手动处理并发错误。
我在这里做对了,我应该坚持短暂的交易,还是只是一个偏好问题?
我一直在试图找到答案,但没有找到任何明确的东西(有些人说长期交易不是一个好主意,但他们似乎没有解释为什么(。
有些人说长期交易不是一个好事 想法,但他们似乎没有解释为什么
只有几个原因:
MS SQL事务,根据其隔离级别,可以获得记录(更通用(甚至元数据(更奇特(锁。事务生存的时间越长,它可以获得的锁就越多,因此,死锁的可能性增加。
此外,未提交的事务意味着服务器资源利用率。事务日志将增长,其活动事务的数据不会被截断,服务器必须记住所有的事情,这些事情已经在事务中完成以提交或回滚。
默认情况下,我使用我实例化的每个 DbContext 打开一个事务
这样做应该是有原因的。我能想象的唯一原因是对数据库的非 EF 更改,它必须与 EF 更改一致。否则,您正在执行额外的工作,这至少是无用的,并且可能会浪费数据库服务器的资源。