2011-12-23 3 views
1

나는 매우 자주교착 상태를 업데이트하고 무효화하려면 SQL을 작성하는 방법?

UPDATE Users SET UserPoint=UserPoint+(@UserPoint) WHERE [email protected] 

나는 더러운 읽거나 더러운 쓰기하지만 교착 상태를보고 싶지 않아, 최대 수있는 방법이 교착 상태를 피할 수있는 기회가 허용 할 수 있습니다이 SQL을 수행 할 필요가?

편집

OK, @Tomtome이 교착하지 않을 수 있습니다, 나를 위해 좋은 소식 이잖아.

여기 새 질문을 따르므로 도움을 받으시기 바랍니다.

는 또한 데이터를 읽을 필요, 그래서 그것은 거래, 단순한 한 줄 SQL 아니다, 나는 이미 nolock를 사용

SELECT UserPoint FROM [Users] WITH (NOLOCK) WHERE [email protected] 

을 사용하여 내가 교착 상태를 방지하기 위해 SET TRANSACTION ISOLATION LEVEL를 사용해야 할 , 내가 더티 읽기를 허용한다면.

EIDT는 다시

나는 SET 격리 수준이 커밋 및 NOLOCK 함께이 같은 일이다 읽어 생각합니다. 그래서 완료. 모두 감사합니다.

+0

왜 교착 것)

그래서, 문제는 시작에 존재하지 않는? 한 행만 업데이트하지 않습니까? 동일한 행을 업데이트하는 다른 것이있을 가능성이 있습니까? – Simon

+0

이렇게 추측하고 싶지는 않습니다 : userID는 고유하거나 기본 색인을 가지고 있습니까? 그리고 그것은 클러스터 된 인덱스의 일부입니까? [One Table Deadlocks] (http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/01/01/reproducing-deadlocks-involving-only-one-table.aspx) – xQbert

+0

예, UserID가 클러스터 된 인덱스에 있습니다. 그리고 모든 사람이 동일한 행을 업데이트 할 가능성이 매우 큽니다. –

답변

3

교착 상태를 피할 수있는 방법이 있습니까?

아니요.이 문장은 취소 할 수 없으므로.

교착 상태는 최소한 두 개의 잠금 (a 및 b)을 유지해야합니다. 따라서 하나의 프로세스는 A를 잠그고 B를 기다리고, 다른 프로세스는 B를 기다리고 A를 기다리고 기다리는 것으로 해결할 수있는 프로세스가 없습니다. 위의 명령.이 잠금을 _ 견하면 교착 상태가 아닌 대기 (가능하게는 시간 종료)됩니다.

더 많은 명령문이있는 더 큰 트랜잭션의 일부가 아니라면 말입니다.

관련 문제