1. ホーム
  2. c#

System.Transactions TransactionScopeのデフォルトのIsolationlevelがSerializableである理由

2023-07-13 04:46:41

疑問点

私はちょうど良い を使用する良い理由は何でしょうか? をデフォルトの分離レベルとして使用する良い理由は何なのでしょうか? System.Transactions トランザクションスコープ は、思いつかないので(そして、デフォルトを web/app.config で変更できないようなので、常にコードで設定する必要があります)

using(var transaction = TransactionScope()) 
{
    ... //creates a Transaction with Serializable Level
}

代わりに、私はいつもこのような定型的なコードを書かなければなりません。

var txOptions = new System.Transactions.TransactionOptions();
txOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;

using(var transaction = new TransactionScope(TransactionScopeOption.Required, txOptions)) 
{
    ...
}

何かアイデアはありますか?

どのように解決するのですか?

事実 Serializable がデフォルトであることは、.NET がまだリリースされていなかった時代 (1999 年以前) から、DTC ( 分散トランザクション コーディネータ ) プログラミングに由来します。

DTC はネイティブの ISOLATIONLEVEL 列挙しています。

分離レベル_シリアライズ可能 現在のトランザクションによって読み取られたデータは 現在のトランザクションが終了するまで、他のトランザクションによって変更されることはありません。 が終了するまで、他のトランザクションによって変更されることはありません。現在のトランザクションに影響を与えるような新しいデータを挿入することはできません。 を挿入することはできません。 これは最も安全な分離レベルであり、デフォルトです。 しかし、最も低いレベルの並行処理が可能です。

.NET TransactionScope はこれらの技術の上に構築されています。

さて、次の疑問は、なぜDTCが定義する ISOLATIONLEVEL_SERIALIZABLE をデフォルトのトランザクションレベルとして定義しているのでしょうか?それは、DTCが1995年頃(確実に1999年以前)に設計されたからでしょう。当時、標準SQLはSQL-92(またはSQL2)でした。

そして、以下がその内容です。 SQL-92 はトランザクションレベルについて述べています。

SQLトランザクションはREAD UNCOMMITTED、READ COMMITTED、SERIALIZABLEのいずれかの分離レベルを持ちます。 READ COMMITTED、REPEATABLE READ、またはSERIALIZABLEです。SQLトランザクションの分離レベル SQLトランザクションの分離レベルは、その中のSQLデータやスキーマに対する操作が、どの程度まで可能かを定義します。 SQLトランザクションの分離レベルは、そのSQLトランザクション内のSQLデータまたはスキーマに対する操作が、どの程度の影響を受けるかを定義します。 SQL-トランザクション内のSQLデータやスキーマに対する操作が、どの程度 の操作に影響を与える程度を定義します。 SQL-トランザクションの分離レベルはSERIALIZABLEです。 トランザクションの分離レベルはデフォルトではSERIALIZABLEです。 . このレベルは明示的に で設定することができます。 <set transaction statement> .

分離レベルの同時実行SQLトランザクションの実行は SERIALIZABLEはシリアライザブルであることが保証されています。直列化可能な 実行とは、同時に実行されるSQLトランザクションの操作の実行であると定義されます。 同時実行するSQLトランザクションの操作の実行で、同じSQLトランザクションの直列実行と同じ効果をもたらすものです。 同じSQLトランザクションの直列実行と同じ効果をもたらすものです。直列実行とは 直列実行とは,各SQLトランザクションが次のSQLトランザクションが始まる前に完了するよう 次の SQL-トランザクションが始まる前に完了するものです。