Кратък отговор:Не
Дълъг отговор:
Само дефинирането на TransactionScope не дефинира, че всяко четене или запис ще бъде извикано в рамките на транзакция.
За да изпълните нещо в рамките на транзакция, все още трябва да отворите и ангажирате транзакция!
TransactionOptions
на TransactionScope за 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())
{
// 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 реагира на тези настройки, като използвате SQL Server Profiler.
Просто създайте ново проследяване и внимавайте за Audit Login
събитие, текстът на събитието ще включва нивото на изолация и можете да видите, че то всъщност прави Audit Login
всеки път, когато се създава транзакция, например
set transaction isolation level read uncommitted
--
Моля, поправете ме, ако някоя от тази информация може да е грешна, току-що разбрах това сам, така че може да има някакъв потенциал за неуспех;)