PayPal 인스턴트 결제 알림을받을 때 보험 상품 배송과 같은 제품을 만들 예정인 응용 프로그램을 만들고 있습니다. 유감스럽게도 PayPal에서는 중복 알림을 보내는 경우가 있습니다. 또한 PayPal로부터 업데이트를받을 때 동시에 웹 서비스 업데이트를 수행하는 제 3 자도 있습니다.중복 방지를 위해 IsolationLevel.RepeatableRead
다음은 관련된 데이터베이스 테이블의 기본 다이어그램입니다. 동시에이 일을 두 개 (또는 그 이상)의 스레드 (또는 프로세스 또는 응용 프로그램)이있는 경우
using (SqlConnection conn = new SqlConnection(...))
{
sqlTransaction sqlTrans = conn.BeginTransaction(IsolationLevel.RepeatableRead);
// Calls a stored procedure that checks if the foreign key in the transaction table has a value.
if (PackageDB.HasInsurancePolicy(packageID, conn))
{
sqlTrans.Commit();
return false;
}
// Insert row in foreign table.
int policyID = InsurancePolicyDB.Insert(coverageAmount, conn);
if (policyID <= 0)
{
sqlTrans.Rollback();
return false;
}
// Assign foreign key to parent table. If this fails, roll back everything.
bool assigned = PackageDB.AssignPolicyID(packageID, policyID, conn);
if (!assigned)
{
sqlTrans.Rollback();
return false;
}
}
, 내가 원하는 : 여기
// table "package"
// columns packageID, policyID, other data...
//
// table "insurancepolicy"
// columns policyID, coverageAmount, other data...
내가 뭘 원하는지의 기본이다 정책이 생성되고 policyID가 패키지 테이블에 할당 될 때까지 policyID가없는 동안 "패키지"행을 잠그는 첫 번째 스레드. 그런 다음 policyID가 패키지 테이블에 할당 된 후 잠금이 해제됩니다. 이 코드를 호출하는 다른 스레드가 package 행을 읽어 policyID가 없는지 확인하기 위해 일시 중지됩니다. 첫 번째 트랜잭션의 잠금이 해제되면 두 번째 트랜잭션에서 policyID가 표시되어 정책 테이블에 행을 삽입하지 않고 반환되기를 바랍니다.
참고 : CRUD 데이터베이스 설계로 인해 각 저장 프로 시저에는 읽기 (선택), 만들기 (삽입) 또는 업데이트가 포함됩니다.
RepeatableRead 트랜잭션 격리를 올바르게 사용합니까?
감사합니다.
패키지 란 무엇입니까? 정책 관계는 무엇입니까? 1시 1 분인가요? – Constantin
n : 1입니다. 부모 테이블은 실제로 "패키지"를위한 테이블이 아니며 설명하기 위해 호출했습니다.실제로 이러한 "패키지"는 전체 소포에 대한 하나의 보험 정책과 함께 결합되어 배송 될 수있는 주문과 같습니다. – devlord