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

时间:2015-07-14 16:51:06

标签: 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();
    } 
}

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

尝试#1:

我尝试跟踪所有类型的事件,并在跟踪结果中使用“isolation”关键字进行搜索。我找到的只有两件事:

EventClass          TextData
-------------------------------------------------------------
ExistingConnection  set transaction isolation level read committed
AuditLogin          set transaction isolation level read committed

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

尝试#2:

如果事务已经启动但尚未提交,则可以SPID并从dm_exec_sessions视图中手动选择实际隔离级别:

SELECT transaction_isolation_level
FROM sys.dm_exec_sessions
WHERE session_id = @Tran_SPID

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

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

P.S。实体框架6.1.3和MS SQL Server 2012。

2 个答案:

答案 0 :(得分:0)

您无法在Profiler中找到事务隔离级别,因为它从未被记录。 有关说明,请参阅How to monitor transaction isolation level changes in SQL Profiler or in any other tool

答案 1 :(得分:0)

您选择了错误的工具,因为使用Entity Framework Profiler可以轻松地检查隔离级别(以及有关EF行为的许多信息)。

这是我的交易示例:

begin transaction with isolation level: ReadCommitted

EF Profiler

更多信息:https://hibernatingrhinos.com/products/efprof/learn