我试图让EF 6的默认事务隔离级别使用快照隔离,但它不起作用,而且总是使用Readcommitted。以下是我迄今所做的工作:
通过执行以下命令,我已在Server 2014数据库上启用了Server快照隔离:
ALTER DATABASE MyDb
SET READ_COMMITTED_SNAPSHOT ON
GO
ALTER DATABASE MyDb
SET ALLOW_SNAPSHOT_ISOLATION ON
GO我有一个DbContext实现,并编写了下面的Linqpad脚本来输出正在使用的隔离级别,它总是显示"Readcommitted“,这很糟糕。下面是Linqpad脚本:
void Main()
{
this.Database.SqlQuery<string>(@"SELECT CASE transaction_isolation_level
WHEN 0 THEN 'Unspecified'
WHEN 1 THEN 'ReadUncomitted'
WHEN 2 THEN 'Readcomitted'
WHEN 3 THEN 'Repeatable'
WHEN 4 THEN 'Serializable'
WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATION_LEVEL
FROM sys.dm_exec_sessions
where session_id = @@SPID
").Single().Dump();
}我已经看到人们通过newing事务显式地设置事务隔离级别,但是我希望将快照隔离设置为默认事务类型,比如在我的OnModelCreating中的DbContext覆盖中。这有可能吗?还是您总是必须在显式事务中执行此操作?我们使用统一IoC为我们注入我们的DbContext,并且我们目前在代码中的任何地方都不声明任何显式事务。
发布于 2019-10-15 08:20:04
SET READ_COMMITTED_SNAPSHOT ON时,在READ COMMITTED下运行的所有事务都将使用Server的行版本控制。READ COMMITTED是Server中的默认隔离级别。这意味着,除非应用程序指定不同的隔离级别(就像实体框架的旧版本那样),否则使用SET READ_COMMITTED_SNAPSHOT ON将立即允许应用程序使用行版本控制。换句话说,READ COMITTED是您在使用SET READ_COMMITTED_SNAPSHOT ON时要使用的隔离级别。SET ALLOW_SNAPSHOT_ISOLATION ON时,现在允许对数据库运行的事务使用SET TRANSACTION ISOLATION LEVEL SNAPSHOT。在SNAPSHOT下运行的事务也将使用Server的行版本控制。但是,您必须在应用程序中显式地将隔离级别设置为SNAPSHOT。现在您应该明白,您不必同时使用SET READ_COMMITTED_SNAPSHOT ON和SET ALLOW_SNAPSHOT_ISOLATION ON,因为它们都是不同的方法,可以使事务使用Server的行版本控制。
SET READ_COMMITTED_SNAPSHOT ON将立即改变应用程序的工作方式,但不必更改代码。SET ALLOW_SNAPSHOT_ISOLATION ON将使您更好地控制哪些事务使用Server的行版本控制,不会立即改变应用程序的工作方式,但您必须更改代码才能使用它。在作出决定之前,您应该知道SET READ_COMMITTED_SNAPSHOT ON与使用SNAPSHOT隔离级别和SET ALLOW_SNAPSHOT_ISOLATION ON之间存在差异。虽然这两种方法都允许您的事务使用Server的行版本控制,但存在很大的行为差异:Read committed Snapshot VS Snapshot Isolation Level
https://stackoverflow.com/questions/43120773
复制相似问题