我有以下代码创建可序列化的事务。该应用程序按预期工作:
using (var tx = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.Serializable, Timeout = new TimeSpan(0, 2, 0) }))
{
// Modify database using EF.
tx.Complete();
}
但是,对数据库进行分析会让我感到困惑。
// Start of transaction (and the first query). Login has invalid ISO LEV.
Audit Login ... set transaction isolation level read committed ...
SQLTransaction 0 - Begin
RPC:Completed exec sp_executesql N'SELECT TOP (1)...
// Second query in transaction. Login now has valid ISO LEV.
Audit Logout
RPC:Completed exec sp_reset_connection
Audit Login ... set transaction isolation level read serializable ...
RPC:Completed exec sp_executesql N'SELECT TOP (1)...
因为我可以看到第一个查询IS实际上是在serializable下执行的(我可以从它获取的锁中推断出这一点),我可以得出的唯一理由是Audit Login只是在记录点时声明了SPID的ISO级别on, not 它正在改变它。
如果是这种情况,那么触发ISO更改的事件在哪里?我打开了所有活动,看不到任何东西......
答案 0 :(得分:1)
更改事务隔离级别不是RPC:Completed
事件。
仔细检查您是否正在监控SQL:BatchStarting
和SQL:BatchCompleted
事件。