实体框架:如何在SQL事件探查器中查找事务隔离级别?

Ily*_*kov 9 sql-server entity-framework transactions sql-server-2012 entity-framework-6

BeginTransaction 方法用于管理实体框架6中的事务.它允许为事务设置隔离级别,如下面的代码中所示(仅示例):

using (var context = new DataContext())
{
    using (var transaction = context.Database.BeginTransaction(IsolationLevel.Serializable))
    {
        context.Entities.Add(new Entity());

        context.SaveChanges();

        transaction.Commit();
    } 
}
Run Code Online (Sandbox Code Playgroud)

问题是:当我使用SQL Server Profiler时,我找不到任何有关真正SQL事务的隔离级别的信息.

尝试#1:

我试图跟踪所有类型的事件,并在跟踪结果中通过"isolation"关键字进行搜索.我找到的只有两件事:

EventClass          TextData
-------------------------------------------------------------
ExistingConnection  set transaction isolation level read committed
AuditLogin          set transaction isolation level read committed
Run Code Online (Sandbox Code Playgroud)

READ COMMITTED总是在这些事件中.所以它不是关于我的代码,因为IsolationLevel.Serializable设置在上面.

尝试#2:

由于事务已经启动但尚未提交,因此可以SPIDdm_exec_sessions视图中手动选择实际隔离级别:

SELECT transaction_isolation_level
FROM sys.dm_exec_sessions
WHERE session_id = @Tran_SPID
Run Code Online (Sandbox Code Playgroud)

这是非常不受欢迎的方式.

是否可以直接在Profiler中记录任何EF生成的事务/会话的隔离级别?也许我只是使用错误的工具?

PS实体框架6.1.3和MS SQL Server 2012在船上.

Ale*_*lex 1

您无法在探查器中找到事务隔离级别,因为它从未被记录。请参阅如何在 SQL Profiler 或任何其他工具中监视事务隔离级别更改以获取说明。