私は、同時に実行されるトランザクションを持っています。特定の参照のエントリが存在する場合、データを更新しなければなりません。それに応じて参照を設定してください。これまでのところ、私が持っているコードはこのように書き:ReadCommittedに分離レベルを設定しているにもかかわらず、汚れた読み込みを取得する
using (var context = new MyDbContext())
{
using (var scope = context.Database.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
{
try
{
MyModel model = null;
int hasEntry = context.MyModel.Where(x => x.refID == refID).Count();
if (hasEntry == 0)
{
model = new MyModel();
model.refID = refID;
}
else
{
model = context.MyModel.Where(x => x.refID == refID).Single();
}
// process model object...
if (hasEntry == 0)
{
context.MyModel.Add(model);
}
else
{
context.Entry(model).State = EntityState.Modified;
}
context.SaveChanges();
scope.Commit();
}
catch(Exception)
{
scope.Rollback();
}
}
}
場合は2つ(またはそれ以上)の場合は、最初の1つのインサートを実行しますが、その後remaningものは更新されません。侵害されたPKについて不平を言うDBUpdateExceptionをスローします。
更新する必要があるものが実際に挿入しようとしている理由がわかりません。彼らは例外をスローするように既にテーブルに追加されたIDを取得します。
AFAIK IsolationLevel.ReadCommittedは行をロックし、トランザクションが完了したときにそれらを解放する必要があります。ドキュメント(https://msdn.microsoft.com/en-us/library/cc546518.aspx)によると、 "接続が読み取り専用コミットレベルを使用していて、SQL ServerがDMLステートメントの実行中にダーティ行を検出すると、行を現在所有しているトランザクションがコミットまたはロールバックされてから続行されるまで待機します実行。"
インスタンスが最初に挿入されたインスタンスを待っていないため、インスタンスが既に(すでに使用されているIDを使用して)挿入しようとしているため、PK違反が発生するため、
私には何が欠けていますか?
PD:これはC#とentityframeworkを使用した私の最初のプロジェクトです。私はたくさんの検索をしてきましたが、答えが見つからなかったので、質問が愚かなものであれば私を許してください。
あなたは正しいですが、私はこのようなロックを適用することによって、問題を解決しました:http://stackoverflow.com/questions/13404061/how-can-i-lock-a-table-on-read-using-entity-framework –