Sql server 读取锁的实体框架类型

Sql server 读取锁的实体框架类型,sql-server,entity-framework,Sql Server,Entity Framework,实体框架的默认读锁是什么?如何实现可重复读锁 我在想,也许在某个地方有一个全局设置,以便在默认情况下获取repeatable read类型的readlock,然后在savechanges启动后释放 。此处表示默认隔离级别为快照。如何更改为可重复读取。表示默认隔离模式依赖于数据库 它还提供了一个如何处理事务的示例,这正是您需要从隔离模式可重复读取中获得的好处。注意,他们的例子有一个非常严重的缺陷,因为它会吞噬任何异常 下面是他们示例的固定版本context应该是从DBContext派生的类的实例

实体框架的默认读锁是什么?如何实现可重复读锁

我在想,也许在某个地方有一个全局设置,以便在默认情况下获取repeatable read类型的readlock,然后在savechanges启动后释放

。此处表示默认隔离级别为快照。如何更改为可重复读取。

表示默认隔离模式依赖于数据库

它还提供了一个如何处理事务的示例,这正是您需要从隔离模式
可重复读取
中获得的好处。注意,他们的例子有一个非常严重的缺陷,因为它会吞噬任何异常

下面是他们示例的固定版本
context
应该是从
DBContext
派生的类的实例

使用(var dbContextTransaction=
context.Database.BeginTransaction(
系统.数据.隔离级别.可重复读取)
{
尝试
{
//那你在这里工作
SaveChanges();
dbContextTransaction.Commit();
}
抓住
{
dbContextTransaction.Rollback();
投掷;
}
}
正如Panagiotis Kanavos所警告的,应尽可能避免此类锁定。它降低了可伸缩性,增加了死锁风险,可能会在事务运行时完全阻止其他用户


try-catch回滚
可能被认为是多余的,因为处理正在进行的
System.Data.SqlClient.SqlTransaction
会导致它回滚(而
使用
将确保它得到处理)。但是,由于具体事务可能是其他类型的,这取决于所使用的数据存储,因此在发生故障时显式回滚它更安全。

您将锁与事务隔离级别混淆了。此外,你为什么认为你需要一把锁?听起来您正在寻找悲观锁定,这对于单用户桌面应用程序以外的任何应用程序都是一种非常糟糕的做法。另一方面,乐观并发保证了正确性和可伸缩性,或者您可能正试图通过锁实现对象版本控制,或者至少是签出功能。你不能,因为签出记录进行编辑与锁定无关——这是一个比锁定更复杂的更高层次的概念。在行本身或更好的情况下使用标志,一个或多个单独的表,其中有谁签出了什么基本上,一旦我从一行中读取,我想确保在当前事务完成之前,没有人更改该行。为什么您认为需要这样做?SaveChanges在内部使用事务,因此您不必担心丢失更改。如果您想使用一个长时间运行的事务作为一种快速而肮脏的签出机制,您将产生无法修复的可伸缩性问题。在用户浏览网格或喝咖啡时锁定行是防止应用程序为几个并发用户提供服务的可靠方法。在任何情况下,EF都已使用事务的可重复读取隔离级别。