2

以下に示すシナリオでMS-DTCがどのように動作するかを明確にする必要があります

1) トランザクション スコープ (分離レベル - ReadCommited) 内に複数の接続があります。これにより、MS-DTC が動作します。

a) MS-DTC は自動的に分離レベルを SERIALIZABLE に変更しますか。

b) (Imp) 上記の答えが「はい」で、行のバージョン管理ベースの分離レベルを実装している場合、つまり TransactionScope に加えて、READ_COMMITTED_SNAPSHOT データベース オプションも有効にしています。レベル。

void OuterMethod() {
    TransactionOptions tso = new TransactionOptions();
    tso.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
    using (TransactionScope tx = new TransactionScope(TransactionScopeOption.RequiresNew, tso)) {
        InnerMethod("select * from testtable");
        InnerMethod("update testtable set col1 = N'new value'");
        tx.Complete();
    }
}

static void InnerMethod(string sqlText) {
    using (SqlConnection conn = SqlConnection(connStr)) {
        conn.Open();
        SqlCommand cmd = conn.CreateCommand();
        cmd.ExecuteNonQuery();
    }
}

ありがとう

4

1 に答える 1

2

Serializable がデフォルトの分離レベルですが、MS DTC は TransactionOptions で指定した分離レベルを尊重します

アップデート

1) はい、MS DTC が関与します。

1a) いいえ (上記参照)。

1b) 前の答えは「はい」ではありませんが、READ_COMMITTED_SNAPSHOT は、分離レベルが読み取りコミットされている場合にのみ有効であると理解しています。他の分離レベルでは、独自のロック モデルが適用されます。「READ_COMMITTED_SNAPSHOT オプションが ON に設定されている場合、読み取りコミット分離レベルでの読み取り操作は、行バージョンに基づいており、非ロック モードで実行されます。」

于 2009-11-27T05:16:02.400 に答える