我有以下代码创建一个可序列化的事务。该应用程序按预期工作:
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)...
由于我可以看到第一个查询实际上是在可序列化下执行的(我可以从它获取的锁中推断出这一点),我可以得出的唯一理由是 Audit Login 只是在登录时声明了 SPID 的 ISO 级别,并且不是它正在改变它。
如果是这样,那么触发 ISO 更改的事件在哪里?我已打开所有事件,但什么都看不到...