2014-08-27 4 views
5

루프 자체를 잠글 수 있습니까?루프 자체를 잠글 수 있습니까?

지난 밤에 테스트 팀은 이상한 체크를 열었습니다. 응용 프로그램은 사용자가 사건을 확인하실 수 있습니다 그리드 테스터 두 사건 (IDS : 1, 5)를 선택 연기해야 ​​하나를 제외한 모두 상태가 나는 [사건]을 알고

업데이트 가지고하지 않는 연기를 테이블이 갱신되어야하며, 하나 개의 새로운 레코드 I 양 및 질의에서 [IncidentDetail 표 삽입이 좋아 :. 두 [인시던트] IncidentStatus] 값이 영 (0)되어야하기 때문에
Id IncidentKindCode TransportEntryId CreateDate    IncidentStatus CloseDate 
-- ---------------- ---------------- ---------------------- -------------- --------- 
1 11301   52    2014-08-26 19:23:21.47 1    NULL 
5 11301   56    2014-08-26 20:06:17.94 0    NULL 

Id IncidentId InsertDate    DetailKind Reason IncidentUser PostponeDate 
-- ----------- ---------------------- ---------- --------- ------------ ----------------------- 
9 1   2014-08-26 20:28:37.37 1   TEST TEST 8   2014-08-27 00:00:00.000 
10 5   2014-08-26 20:28:37.37 1   TEST TEST 8   2014-08-27 00:00:00.000 

테스터

불평 유효 포인트. 앱을 파헤친 후 앱이 서버에 보낸 정확한 쿼리를 캡처했습니다 (프로필러 덕분에).

트리거가 없으며 다른 업데이트는 대기중인 트랜잭션이 없습니다. 첫 번째 루프 반복이 두 번째 루프를 차단하여 업데이트가 실패한 경우에도 예외를 발생시켜야하며 모든 트랜잭션을 롤백해야합니다.

삽입이 작동하는 동안 업데이트가 실패 할 수 있습니다. 모든 열에는 표준 형식 (Int, Varchar (100), DateTime 등)이 있는데 암시 적 캐스팅 문제도 테스트했습니다.

이 문제는 한 번만 발생하며 백업을 사용하더라도 재생산 할 수 없지만 문제가 발생한 이유를 찾을 수없는 경우 프로덕션 환경에서 다시 발생할 수 있습니다.

+0

SQL Server의 오류로 인해 일괄 처리가 중단되는 경우가 있습니다. 거래 및 연결과 동일합니다. (예, 이것은 고약합니다.); 따라서 업데이트가 실패하고 삽입물이 통과 될 수 있습니다. 어쩌면 앱에서 오류를 버리는 것일 수 있습니다. – usr

+0

아니요, 트랜잭션 자체를 차단하거나 교착 상태로 만들 수 없습니다. – usr

+0

내부 쿼리 교착 상태가 발생할 수 있으며 발생할 수 있습니다. 제작 코드에서 직접 문제가 발생했습니다. http://blogs.msdn.com/b/bartd/archive/2008/09/24/today-s-annoyingly-unwieldy-term-intra-query-parallel-thread -deadlocks.aspx – Jace

답변

3

나는 당신이 실제로하고 싶은 것을 이해하지 못한다. 나는 내가 이해 한 것을 근거로 당신에게 길을주고있다. 해당 항목이 업데이트되었는지 여부를 확인할 수 있습니다. 업데이트 된 경우 IncidentDetail에 삽입됩니다.

UPDATE [dbo].Incident SET INCIDENTSTATUS = 1 WHERE ID = @SELECTEDID 

If Exists( Select 1 
      From [dbo].Incident As I 
      Where I.ID = @SELECTEDID 
        And I.INCIDENTSTATUS = 1 
     ) 
Begin 
    INSERT [dbo].IncidentDetail (INCIDENTID, DETAILKIND, REASON, INCIDENTUSER, POSTPONEDATE) 
         VALUES (@SELECTEDID, 1, @REASON, @USERCODE, @POSTPONEDATE); 
End 
+0

며칠 후 우리는이 문제가 다른 동료가 행을 삭제하고 우리가 처음에 문제가 아니었다 고 믿는 시각 장애인이 원인이라는 것을 알게되었습니다. 또한 루프가 스스로를 잠글 수 없다는 많은 참고 자료를 발견했습니다. 질문은 처음부터 바보 같았습니다. 많은 사람들이 그것을 방문했기 때문에 그것을 참고 자료로 사용하기 위해 삭제하지 않았습니다. 또한 누군가를 위해 유용 할 수 있으므로 답변을 아프게 표현하십시오. – jean

관련 문제