简短回答:不行。
详细回答:
仅仅定义TransactionScope并不意味着任何读写操作都会在事务中执行。
要在事务中运行某些操作,您仍然需要打开和提交一个事务!
TransactionScope的TransactionOptions选项用于Timeout和IsolationLevel仅定义了在作用域内创建的任何未明确设置这些选项的事务的默认值。实际上,TransactionScope确实会创建一个事务,但是如果不打开新的事务,则该事务将不活动。在内部,这将进行一些复杂的操作,如克隆事务等...所以我们忽略这个...
如果没有事务,您无法定义隔离级别,任何选择语句都将使用IsolationLevel.ReadCommitted,因为这是SQL Server的默认值。
您还可以查询session.Transaction.IsActive以查看会话当前是否处于活动状态!
让我们看看以下代码,我添加了一些注释以使其更加清晰。
using (var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions()
{
IsolationLevel = IsolationLevel.ReadUncommitted
}))
{
using (var session = sessionFactory.OpenSession())
{
var x = session.Transaction.IsActive;
var pp = session.Query<Page>().Where(p => p.Photos.Count() > 1).ToList();
using (var transaction = session.BeginTransaction())
{
var y = session.Transaction.IsActive;
var p1 = session.Get<Page>(1);
transaction.Commit();
}
using (var transaction = session.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
{
var y = session.Transaction.IsActive;
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
--
如果我提供的信息有误,请纠正我,因为这些都是我自己找出来的,所以可能会有失败的风险;)
Audit Login
不是查看正在执行的命令的当前隔离级别的可靠方法。请参阅我的评论在LINQ + TransactionScope中,SQL Server Profiler不会更改隔离级别。在Profiler中难以查看隔离级别的更改,它可能发生在Audit Login行和正在考虑的SQL语句之间。这最好在_divega_的评论中解释http://entityframework.codeplex.com/workitem/1712。 - DeveloperRob