Kort svar:Nej
Langt svar:
Bare det at definere TransactionScope definerer ikke, at nogen læsning eller skrivning vil blive påberåbt i en transaktion.
For at køre noget i en transaktion, skal du stadig åbne og foretage en transaktion!
TransactionOptions
af TransactionScope for Timeout
og IsolationLevel
bare definere standarderne for enhver transaktion, der er oprettet inden for rammerne, uden at disse muligheder udtrykkeligt er angivet. Faktisk opretter TransactionScope en Transaktion, men den vil ikke være aktiv uden at åbne en ny Transaktion. Internt vil dette gøre nogle komplekse ting, kloning af transaktionen osv... så lad os ignorere dette...
Uden en transaktion kan du ikke definere isolationsniveauet, enhver select-sætning vil blive kørt med IsolationLevel.ReadCommitted
fordi dette er standard for SQL Server.
Du kan også forespørge session.Transaction.IsActive
for at se, om en transaktion i øjeblikket er aktiv for sessionen!
Lad os tage et kig på følgende kode, jeg sætter nogle kommentarer for at gøre det lidt mere klart
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();
}
}
Du kan også se, hvordan SQL Server reagerer på disse indstillinger ved at bruge SQL Server Profiler.
Bare opret en ny Trace og pas på Audit Login
begivenhed, vil teksten til begivenheden inkludere isolationsniveauet, og du kan se, at den faktisk udfører et Audit Login
hver gang en transaktion oprettes, f.eks.
set transaction isolation level read uncommitted
--
Ret mig venligst, hvis nogen af disse oplysninger kan være forkerte, jeg har lige fundet ud af det af mig selv, så der kan være en risiko for fejl;)