큰 웹 응용 프로그램에서 많은 교착 상태가 발생합니다. 교착 상태에 대한 데이터가 있지만 그 이유를 이해할 수 없습니다.
How to automatically re-run deadlocked transaction? (ASP.NET MVC/SQL Server)
은 여기 다시 실행 교착 거래를 원했지만은 교착 상태를 제거하는 말을 들었다 - 그것은 교착 상태를 잡으려고 노력보다 훨씬 낫다.그래서 저는 하루 종일 SQL 프로파일 러를 사용하여 추적 키 등을 설정했습니다. 그리고 이것이 제가 가진 것입니다.
Users
테이블이 있습니다.
User = DB.Users.SingleOrDefault(u => u.Password == password && u.Name == username);
: 나는 (그것이 유일한 쿼리 아니지만,이 문제의 원인이되는 하나)
UPDATE Users
SET views = views + 1
WHERE ID IN (SELECT AuthorID FROM Articles WHERE ArticleID = @ArticleID)
그리고 에서 다음 쿼리 ALL 페이지가있어 다음 쿼리와 매우 높은 사용 가능한 페이지가
쿠키에서 사용자를 얻는 곳입니다.
매우 자주 교착 상태가 발생하고이 두 번째 Linq-to-SQL 쿼리가 피해자로 선택되어 실행되지 않으며 내 사이트 사용자에게 오류 화면이 표시됩니다.
이 SQL 프로파일에 의해 캡처 된 .XDL 그래프의 정보입니다 (그것은 하나의 단지 처음 교착 아니다있어 전체 목록은 거대한입니다..) : 나는 교착 상태에 대해 많이 읽어
<deadlock-list>
<deadlock victim="process824df048">
<process-list>
<process id="process824df048" taskpriority="0" logused="0" waitresource="PAGE: 7:1:13921" waittime="1830" ownerId="91418" transactionname="SELECT" lasttranstarted="2010-05-31T12:17:37.663" XDES="0x868175e0" lockMode="S" schedulerid="2" kpid="5076" status="suspended" spid="72" sbid="0" ecid="2" priority="0" trancount="0" lastbatchstarted="2010-05-31T12:17:37.663" lastbatchcompleted="2010-05-31T12:17:37.663" clientapp=".Net SqlClient Data Provider" hostname="WIN-S41KV2CLS67" hostpid="6920" isolationlevel="read committed (2)" xactid="91418" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame procname="adhoc" line="1" stmtstart="74" sqlhandle="0x02000000de1cb30b5b2e40e31ffb345af3c7529430b559c2">
*password------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- </frame>
<frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
unknown </frame>
</executionStack>
<inputbuf>
</inputbuf>
</process>
<process id="process8765fb88" taskpriority="0" logused="216" waitresource="PAGE: 7:1:14196" waittime="1822" ownerId="91408" transactionname="UPDATE" lasttranstarted="2010-05-31T12:17:37.640" XDES="0x86978e90" lockMode="IX" schedulerid="2" kpid="5216" status="suspended" spid="73" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2010-05-31T12:17:37.557" lastbatchcompleted="2010-05-31T12:17:37.557" clientapp=".Net SqlClient Data Provider" hostname="WIN-S41KV2CLS67" hostpid="6920" loginname="sdfkj93jks9sl" isolationlevel="read committed (2)" xactid="91408" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame procname="database.dbo.UpdateUserStats" line="31" stmtstart="1794" stmtend="2088" sqlhandle="0x03000700bac8836333e58f00879d00000100000000000000">
UPDATE Users
SET Views = Views + 1
WHERE ID IN (SELECT AuthorID FROM Articles WHERE ArticleID = @ArticleID) </frame>
<frame procname="adhoc" line="1" stmtstart="84" sqlhandle="0x01000700b7c78e0760dd3f81000000000000000000000000">
EXEC @RETURN_VALUE = [dbo].[UpdateUserStats] @UserID = @p0 </frame>
<frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
unknown </frame>
</executionStack>
<inputbuf>
(@p0 int,@RETURN_VALUE int output)EXEC @RETURN_VALUE = [dbo].[UpdateUserStats] @UserID = @p0 </inputbuf>
</process>
<process id="process86ce0988" taskpriority="0" logused="10000" waittime="1806" schedulerid="1" kpid="2604" status="suspended" spid="72" sbid="0" ecid="0" priority="0" trancount="0" lastbatchstarted="2010-05-31T12:17:37.663" lastbatchcompleted="2010-05-31T12:17:37.663" clientapp=".Net SqlClient Data Provider" hostname="WIN-S41KV2CLS67" hostpid="6920" loginname="sdfkj93jks9sl" isolationlevel="read committed (2)" xactid="91418" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame procname="adhoc" line="1" stmtstart="74" sqlhandle="0x02000000de1cb30b5b2e40e31ffb345af3c7529430b559c2">
*password------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- </frame>
<frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
unknown </frame>
</executionStack>
<inputbuf>
*password-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- </inputbuf>
</process>
</process-list>
<resource-list>
<pagelock fileid="1" pageid="13921" dbid="7" objectname="database.dbo.Users" id="lock85535c80" mode="IX" associatedObjectId="72057594046382080">
<owner-list>
<owner id="process8765fb88" mode="IX"/>
</owner-list>
<waiter-list>
<waiter id="process824df048" mode="S" requestType="wait"/>
</waiter-list>
</pagelock>
<pagelock fileid="1" pageid="14196" dbid="7" objectname="database.dbo.Users" id="lock8469f980" mode="SIU" associatedObjectId="72057594046382080">
<owner-list>
<owner id="process86ce0988" mode="S"/>
</owner-list>
<waiter-list>
<waiter id="process8765fb88" mode="IX" requestType="convert"/>
</waiter-list>
</pagelock>
<exchangeEvent id="Pipe894b0680" WaitType="e_waitPipeGetRow" nodeId="0">
<owner-list>
<owner id="process824df048"/>
</owner-list>
<waiter-list>
<waiter id="process86ce0988"/>
</waiter-list>
</exchangeEvent>
</resource-list>
</deadlock>
... 그리고 이것이 왜 교착 상태를 일으키는 지 이해할 수 없습니다.
분명히 두 쿼리 모두 매우 자주 실행됩니다. 최소한 1 초에 1 번. 어쩌면 더 자주 (300-400 명의 사용자 온라인). 그래서 그들은 동시에 쉽게 실행될 수 있습니다. 그러나 이것이 교착 상태를 일으키는 이유는 무엇입니까? 도와주세요.
는 SQL2005에있는 경우
을 (읽기 쓰기 트랜잭션이 교착되고 만 트랜잭션을 읽기 Linq는 SQL에)
SQL2005 이상이 있습니까? 그렇다면 SQL Profiler에서 교착 상태 그래프를 얻었습니까? 또한 쿼리가 실행중인 트랜잭션 격리 수준을 알고 있습니까? –
예 그래프가 있습니다. 그것이 내가이 정보를 얻은 곳입니다. 나는 트랜잭션 격리에 대해 아무것도 모른다.어디에서 확인할 수 있습니까? – Alex
프로파일 러 추적에서 교착 상태 그래프 이벤트를 마우스 오른쪽 단추로 클릭하고 이벤트 데이터 추출을 선택한 다음 xml로 저장하십시오. 그런 다음 메모장에서 열고 "isolationlevel"을 찾으십시오. –