簡単な答え:いいえ
長い答え:
TransactionScopeを定義するだけでは、トランザクション内で読み取りまたは書き込みが呼び出されることは定義されません。
トランザクション内で何かを実行するには、トランザクションを開いてコミットする必要があります!
TransactionOptions
Timeout
のTransactionScopeの およびIsolationLevel
デフォルトを定義するだけです これらのオプションが明示的に設定されていないスコープ内で作成されたトランザクションの場合。実際、TransactionScopeはトランザクションを作成しますが、新しいトランザクションを開かないとアクティブになりません。内部的には、これはトランザクションのクローン作成など、いくつかの複雑な処理を実行します...したがって、これを無視しましょう...
トランザクションがないと、分離レベルを定義できません。selectステートメントはIsolationLevel.ReadCommitted
で実行されます。 これはSQLServerのデフォルトであるためです。
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プロファイラーを使用して、SQLServerがこれらの設定にどのように反応するかを確認することもできます。
新しいトレースを作成し、Audit Login
に注意してください。 イベントの場合、イベントのテキストには分離レベルが含まれ、実際にAudit Login
を実行していることがわかります。 たとえば、トランザクションが作成されるたびに
set transaction isolation level read uncommitted
-
この情報のいずれかが間違っている可能性がある場合は、訂正してください。失敗する可能性があるため、自分でこれを理解しました;)