我使用以下格式通过 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
但在 SQL Server 探查器中,我在 Connection:Start 中看到以下行。
set transaction isolation level read committed
我经历过这个(http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/93a45026-0425-4d49-a4ac-1b882e90e6d5 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)。
有人可以告诉我我的代码是否实际上是在序列化隔离级别下执行的,还是实际上只是在已提交的读下运行?
这取决于您如何创建交易。
如果您执行内联 SQL 来开始它(EG.BEGIN TRAN
),L2S 不会意识到该事务,并且会在其中启动一个新的嵌套事务READ COMMITTED
.
但是,如果您使用 System.Transaction,或者在您的计算机上设置了事务DataContext
, SubmitChanges 将参与该事务。
如果您选择TM: Begin Tran
and TM: Commit Tran
事件类。
注意:ADO.Net 不会发出问题BEGIN TRAN
也不存在问题SET TRANSACTION ISOLATION
在批次中,这是在较低级别完成的。
If you really想要确认该行为,请在表上创建一个触发器,将当前隔离级别插入到日志记录表中并对其进行检查。
您可以通过运行以下命令来获取当前的隔离级别:
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)