다음 코드가 있다고 가정 해 봅시다 (끔찍하다는 것을 무시하십시오).
BEGIN TRAN;
DECLARE @id int
SELECT @id = id + 1 FROM TableA;
UPDATE TableA SET id = @id; --TableA must have only one row, apparently!
COMMIT TRAN;
-- @id is returned to the client or used somewhere else
내 눈에 이것은 동시성을 올바르게 관리하지 않습니다. 거래가 있다고해서 다른 사람이 업데이트 진술을 받기 전에했던 것과 같은 가치를 읽지 않는다는 의미는 아닙니다.
이제 코드를 그대로 두십시오 (이것은 단일 명령문으로 처리되거나 자동 증분 / ID 열을 사용하는 것이 더 좋습니다) 동시성을 올바르게 처리하고 두 클라이언트가 동일한 결과를 얻을 수있는 경쟁 조건을 방지하는 확실한 방법 id 가치?
WITH (UPDLOCK, HOLDLOCK)
SELECT에 a 를 추가 하면 트릭을 수행 할 것이라고 확신합니다 . SERIALIZABLE 트랜잭션 격리 수준은 (이것은 다른 사람이 트란이 끝날 때까지 당신이 무슨 짓을했는지 읽을 거부하기 때문에뿐만 아니라 작동하는 것 같다 것 UPDATE . :이 거짓 참조 마틴의 대답). 그게 사실입니까? 둘 다 똑같이 잘 작동합니까? 하나는 다른 것보다 선호됩니까?
ID 업데이트보다 합법적 인 일, 즉 업데이트해야하는 읽기를 기반으로 한 계산을 상상해보십시오. 많은 테이블이 관련 될 수 있는데, 그 중 일부는 쓰지 않을 것이고 다른 테이블은 쓰지 않을 것입니다. 가장 좋은 방법은 무엇입니까?
이 질문을 작성한 후에는 필요한 힌트 만 잠그기 때문에 잠금 힌트가 더 낫다고 생각하지만 다른 사람의 의견에 감사드립니다.
추신 : 그리고 가장 좋은 대답을 모르고 실제로 더 나은 이해를 원합니다! :)
update
더 이상 사용하지 않는 데이터를 기반으로 동일한 값을 읽거나 발행하지 못하게 하시겠습니까? 후자의 경우rowversion
열을 사용 하여 업데이트 할 행을 읽은 후 변경되지 않았는지 확인할 수 있습니다 .