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事务的隔离级别的信息。
我尝试跟踪所有类型的事件,并在跟踪结果中使用“isolation”关键字进行搜索。我找到的只有两件事:
EventClass TextData
-------------------------------------------------------------
ExistingConnection set transaction isolation level read committed
AuditLogin set transaction isolation level read committed
READ COMMITTED
总是在这些事件中。所以这不是我的代码,因为上面设置了IsolationLevel.Serializable
。
如果事务已经启动但尚未提交,则可以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。
答案 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