简短的回答:没有
长答案:
仅仅定义 TransactionScope 并没有定义在事务中将调用任何读取或写入。
要在事务中运行某些东西,您仍然必须打开并提交事务!
TransactionOptions
TransactionScope 的,Timeout
只为在范围内创建的任何事务IsolationLevel
定义默认值,而没有显式设置这些选项。实际上,TransactionScope 确实创建了一个事务,但如果不打开一个新事务,它就不会处于活动状态。在内部这会做一些复杂的事情,克隆交易等......所以让我们忽略这个......
如果没有事务,则无法定义隔离级别,任何 select 语句都将运行,IsolationLevel.ReadCommitted
因为这是 SQL Server 的默认设置。
您还可以查询session.Transaction.IsActive
以查看会话当前是否处于活动状态!
让我们看看下面的代码,我放了一些注释让它更清楚一点
using (var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions()
{
IsolationLevel = IsolationLevel.ReadUncommitted
}))
{
using (var session = sessionFactory.OpenSession())
{
// outside any transaction...
var x = session.Transaction.IsActive; // false;
// read will be done with SQL Server default (ReadCommited)
var pp = session.Query<Page>().Where(p => p.Photos.Count() > 1).ToList();
using (var transaction = session.BeginTransaction())
{
// will use ReadUncommitted according to the scope
var y = session.Transaction.IsActive; // true;
var p1 = session.Get<Page>(1);
transaction.Commit();
}
using (var transaction = session.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
{
// will use ReadCommitted according to the transaction initialization
var y = session.Transaction.IsActive; // true;
var p1 = session.Get<Page>(1);
transaction.Commit();
}
scope.Complete();
}
}
您还可以使用 SQL Server Profiler 观察 SQL Server 如何对这些设置做出反应。
只需创建一个新的 Trace 并注意Audit Login
事件,事件的文本将包括隔离级别,您可以看到它实际上在Audit Login
每次创建事务时执行,例如
set transaction isolation level read uncommitted
--
如果这些信息中的任何一个可能有误,请纠正我,我只是自己想出来的,所以可能会有一些失败的可能性;)