私は 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
。
私の質問は、データベースのデフォルトの分離レベルを設定する方法です。