6

私は EF 4.0 を使用していますserializableが、トランザクションで読み取り時にレジスタをブロックしたいので、分離レベルを使用したいと考えています。

SQL Server では、次のコマンドで分離レベルを変更しようとしています。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

C# では、次のコードを使用してレジスタをブロックしようとします。

using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.Serializable }))
{
   Entities myContext = new Entities();
   string colors = "select * from Colors where IDColor = 2";
   Colors myColor = myContext.Colors.SqlQuery(colors).FirstOrDefault<Colors>();
   myColor.Color = "Red";
   myContext.SaveChanges();
   scope.Complete();                  
}

コードを 1 行ずつ実行すると、取得してSaveChangesも実行されない場合、たとえば SQL Server Management Studio でテーブルの色にクエリを実行すると、レコードを取得できます。

次に、変更の保存を実行して を取得するとscope.Clompete()、Management Studio でクエリを実行しても、レジスタがブロックされているため何も得られないため、C# コードを終了すると、レジスタが解放され、結果が得られます管理スタジオ。

私の質問は、C# でシリアル化可能な分離レベルを使用する方法ですか? 私は何か間違ったことをしていますか?

PS: このコマンドを使用すると、次のことがわかります。

DBCC useroptions;

分離レベルがserializableであることがわかりますが、Management Studio を閉じて再度接続すると、分離レベルがデフォルトであることがわかりますreadCommitted

私の質問は、データベースのデフォルトの分離レベルを設定する方法です。

4

1 に答える 1

2
  • デフォルトの EF トランザクション分離レベルは、使用されているデータベース プロバイダーに基づいています。

  • ef コードで分離レベルが指定されていない場合、データベース サーバーの既定の分離レベルになるはずです。

  • SQL Server では、デフォルトの分離レベルは READ COMMITED です。

  • したがって、EF コードで IsolationLevel を指定する必要はありません。DB 側で設定すると、EF のデフォルトの IsolationLevel としても使用されます。

データベース エンジンで DB チェック分離レベルのIsolationLevelを変更し、 TRANSACTION ISOLATION LEVEL を設定する方法 (Transact-SQL)

アップデート

変更するにはisolation level、SSMS で以下のコマンドを実行します。

USE YourDatabaseName;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

適用されているか確認するには?

USE YourDatabaseName;
GO
DBCC useroptions

MSDN は次のように述べています。

一度に設定できる分離レベル オプションは 1 つだけであり、明示的に変更されるまで、その接続に対して設定されたままになります。トランザクション内で実行されるすべての読み取り操作は、ステートメントの FROM 句のテーブル ヒントがテーブルに対して異なるロックまたはバージョン管理動作を指定しない限り、指定された分離レベルのルールの下で動作します。

これがお役に立てば幸いです。

于 2013-01-26T13:19:40.687 に答える