2009-10-26 4 views
0

가끔씩 SQL Server에서 교착 상태가 발생합니다. 데이터베이스가 아닌 작업 (신용 카드 처리)을 잠그는 기능을 만들었으므로 중복이 발생할 수 없습니다. 내 함수는 다음과 같습니다 (tcl은 유감 스럽지만 SQL은 충분히 명확합니다). 왜 교착 상태가 때때로 발생하는지 누가 알 수 있습니까 ?????sqlserver에서 교착 상태 얻기

proc ims_syn_lock_object { db object {timeout 30} {wait 1}} { 
    if {[catch { 
     while {true} { 
      am_dbtransaction begin $db 

      # read the object locks that aren't timed out  
      set result [am_db1cell $db "SELECT object from GranularLocks WITH (ROWLOCK,HOLDLOCK) where object = [ns_dbquotevalue $object] AND timeActionMade > DATEADD(second,-timeout, GETDATE())"] 

      # check to see if this object is locked and not timed out 
      if { [string equal "" $result] } { 
       break; 
      } else { 
       # another process has this object and it is not timed out. 
       # release the row lock 
       am_dbtransaction rollback $db 

       if { $wait } { 
        # sleep for between 400 and 800 miliseconds 
        sleep [expr [ns_rand 400] + 400]      
       } else { 
        # we aren't waiting on locked resources. 
        return 0; 
       } 
      }    
     } 

     # either the object lock has timed out, or the object isn't locked 
     # create the object lock.   
     ns_db dml $db "DELETE FROM GranularLocks WHERE object = [ns_dbquotevalue $object]" 
     ns_db dml $db "INSERT INTO GranularLocks(object,timeout) VALUES ([ns_dbquotevalue $object],[ns_dbquotevalue $timeout int])" 

     # releases the row lock and commits the transaction 
     am_dbtransaction commit $db  

    } errMsg]} { 
     ns_log Notice "Could not lock $object. $errMsg" 
     catch { 
      am_dbtransaction rollback $db 
     } errMsg 
     return 0 
    } 
    return 1  

} 


proc ims_syn_unlock_object {db object } { 

    #simply remove the objects lock 
    ns_db dml $db "DELETE FROM GranularLocks WHERE object = [ns_dbquotevalue $object]" 

} 

답변

1
  1. 시도가 너무

  2. 작동 이런 종류의 제공 sp_getapplock을 시도 배타적 잠금을 강제로.

개인적으로 2 번을 선호하는 것 ...

+0

나는 롤 UPDLOCK로 그 HOLDLOCK을 읽었습니다 맹세합니다. 나는 네가 그것을 못 박았을 것이라고 확신한다. –

0

교착 상태 그래프가 있으면 유용합니다.

쿼리가 포함되어 있기 때문에 SQL 교착 상태가 발생할뿐만 아니라 중요한 스키마가 너무 복잡합니다. 예를 들어, 읽기 및 쓰기가 데이터에 대한 다른 액세스 경로를 선택하기 때문에 완벽하게 유효한 '올바른'쿼리로 Reader-Writer deadlocks을 얻을 수 있습니다. 'object'열을 포함하지 않는 GranularLocks에서 timeActionMade에 대한 색인이 존재하는 경우이 문제가 발생할 수 있습니다. 그러나 다시, 솔루션은 실제 교착 상태가 무엇인지에 달려 있습니다. 1 선택에 UPDLOCK을 추가