LINQ + TransactionScope不会更改SQL Server Profiler中的隔离级别

Das*_*jes 4 transactions sql-server-profiler isolation-level sql-server-2008 linq-to-sql

我正在使用以下格式使用linq将更改提交到我的数据库.

Begin Transaction (Scope Serialized, Required)
    Check Business Rule 1...N
    MyDataContext.SubmitChanges()
    Save Changes Done In Previous Query To Log File
End Transaction Scope
Run Code Online (Sandbox Code Playgroud)

但是在SQL Server探查器中,我在Connection:Start中看到以下行.

set transaction isolation level read committed
Run Code Online (Sandbox Code Playgroud)

我经历了这个(http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/93a45026-0425-4d49-a4ac-1b882e90e6d5)并认为我得到了答案;

直到我在Microsoft Connect上看到这个(https://connect.microsoft.com/VisualStudio/feedback/details/565441/transactionscope-linq-to-sql?wa=wsignin1.0).

有人可以告诉我,我的代码是否实际在序列化隔离级别下执行,或者它是否只是在read committed下运行?

Sam*_*ron 7

这取决于您创建事务的方式.

如果你执行了内联SQL来开始它(EG.BEGIN TRAN),L2S将不会知道该事务,并将启动一个新的嵌套READ COMMITTED.

但是,如果您使用了System.Transaction,或者在您的事务上设置了事务DataContext,则SubmitChanges将参与该事务.

如果选择TM: Begin TranTM: Commit Tran事件类,您可以在Profiler中看到这些事务的启动和停止.

注意:ADO.Net不会发布,BEGIN TRAN也不会SET TRANSACTION ISOLATION批量发布,这是在较低级别完成的.

如果您确实要确认该行为,请在表上创建一个触发器,将当前隔离级别插入日志记录表并检查它.

您可以通过运行以下命令获取当前的隔离级别:

SELECT CASE transaction_isolation_level 
WHEN 0 THEN 'Unspecified' 
WHEN 1 THEN 'Read Uncommitted' 
WHEN 2 THEN 'Read Committed' 
WHEN 3 THEN 'Repeatable Read' 
WHEN 4 THEN 'Serializable' 
WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATION_LEVEL 
FROM sys.dm_exec_sessions 
where session_id = @@SPID
Run Code Online (Sandbox Code Playgroud)