몇 가지 요청을 거의 동시에받는 Webservice가 있습니다.엔티티 프레임 워크에서 교착 상태가 발생했습니다.
두 개의 요청 트랜잭션이 교착 상태가 발생하여 재실행을 롤백해야합니다.
using (var context = new DbContext())
using (var dbContextTransaction = context.Database.BeginTransaction(IsolationLevel.Serializable))
{
var subscription = context.Subscriptions.FirstOrDefault(x => x.Provider == provider);
if (subscription == null)
{
*/Insert*/
}
else
{
/*Update*/
}
context.SaveInTransaction(null);
dbContextTransaction.Commit();
}
저는 두 요청 모두 거래를 입력하고 구독 표를 읽음을 이해합니다. 커밋 준비가 완료되면 다른 트랜잭션 (IsolationLevel.Serializable)에서 읽은 데이터 범위에 값을 삽입 할 수 없기 때문에 교착 상태가됩니다.
TransactionLevel Serialize를 만들지 않으면 요청 중 하나가 공급자 열의 고유 제약 조건을 충족하지 못하고 Rollbacked가 발생합니다.
교착 상태를 방지하려면 어떻게해야합니까? 내가 TransactionLevel Serializeable을하지 않으면
당신이 사용할 수있는'lock' https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/ :
당신처럼 DbContext 뭔가에 메서드를 추가 할 수 있습니다 keywords/lock-statement – Hackerman
고유 한 위반을 나타내는 예외를 catch하고 재 시도하거나 원시 작업을 수행하기 위해 raw SQL을 사용하여 하나의 원자 작업에서 "upsert"(SQL 서버의 해당 작업이 MERGE 임)를 수행하십시오. 나는 EF에서 그것을 다루는 다른 방법을 알지 못한다. – Evk