내 ColdFusion 응용 프로그램 (MS SQL 2008에 백엔드)에서 쿼리에 문제가 있습니다. 나는이 거래에 DB 교착 상태 오류가 계속 :TSQL SELECT를 한 트랜잭션에서 업데이트 한 다음 SELECT를 반환합니다.
<code>
<cftransaction>
<cfquery name="selectQuery">
SELECT TOP 20 item_id, field2, field3
FROM Table1
WHERE subject_id = #subject_ID# AND lock_field IS NULL AND
NOT EXISTS (SELECT * FROM Table2 WHERE Table2.user_ID = #user_ID# Table1.item_id = Table2.item_id)
</cfquery>
<cfquery name="updateQuery">
UPDATE Table1
SET lock_field = 1, locked_by = #user_ID#
WHERE Table1.item_id IN (#ValueList(selectQuery.item_id#)
</cfquery>
</cftransaction>
</code>
Bascially, 나는 테이블 대기 항목의 큰 큐를 나타냅니다 (표 1)를 가지고있다. 사용자는 "체크 아웃"항목을 사용하여 점수를 부여합니다. 한 번에 한 명의 사용자 만 항목을 체크 아웃 할 수 있습니다. 주어진 사용자에 대해 한 번에 20 개의 항목 블록을 요청해야합니다. 이러한 항목은 이미 체크 아웃 할 수 없으므로 사용자는 이전에 이미 점수를 매길 수 없습니다 (따라서 SELECT의 lock_field IS NULL 및 NOT EXISTS 문). item_ids 20 개 목록을 확인한 후에는 대기열 테이블을 업데이트하여 다른 사람이 동시에 체크 아웃 할 수 없도록 큐 테이블을 잠근 것으로 표시해야합니다. 또한 item_ids 목록을 반환해야합니다.
SQL Server 측에서 cftransaction에서 stored proc로 이동하면 더 잘 작동한다고 생각했습니다. cftransaction 잠금이 어떻게 든 방해가되는지 확실하지 않습니다. 나는 TSQL 전문가가 아니기 때문에 도움을 얻을 수있을 것이다.
업데이트 작업을 보호하기 위해''이 있습니까? 이 방법으로 모든 동시성 문제는 없어집니다. –
Tomalak
업데이트가 cftransaction의 일부입니다. 나는 cflock이 필요하다고 확신하지 않습니다. –
cftransaction은 오류가 발생하는 즉시 오류 내에서 실행 된 모든 SQL 문을 롤백합니다. 코드 섹션을 잠그지 않습니다. – Tomalak