멀티 세션 환경에서 특정 클라이언트 세션이 레코드를 얻었고 (이후 추가 업데이트를 위해 소유하고 있음을 나타 내기 위해) 테이블의 단일 레코드를 업데이트하려고합니다. 지금까지이있어 :원자 배타적 SQL 레코드 업데이트
create procedure AcquireRow(
@itemNo int, -- Item ID to acquire
@sessNo int, -- Session ID
@res char(1) out) -- Result
as
begin
-- Attempt to acquire the row
update Items
set
State = 'A', -- 'A'=Acquired
SessionID = @sessNo
where ItemID = @itemNo
and State = 'N'; -- 'N'=Not acquired
-- Verify that the session actually acquired the row
set @res = 'T'; -- 'T'=Success
if @@rowcount = 0
set @res = 'F'; -- 'F'=Failure
end;
아웃 된 변수 @state
이 프로 시저가 성공적으로 행을 구입 한 경우 'T'
로 설정, 그렇지 않으면 실패를 나타내는 'F'
로 설정합니다.
내 질문 : 여러 세션에서 AcquireRow()
을 동시에 호출하면 하나의 세션 만 성공적으로 (업데이트) 행을 얻을 수 있도록 원자 적으로 작동하도록 보장됩니까? 아니면 이것을하는 더 좋은 방법이 있습니까? 명시 적으로 rowlock
이 필요합니까?
는 개정 : 레무스의 답변에 따라
, 나는 이렇게 코드를 재 배열 :
set @res = 'F';
update ...;
if @@rowcount > 0
set @res = 'T';
가 output
절을 사용하거나 update
내에서 변수에 결과 행의 ItemID
는 신중한 것 할당.
아주 비슷한 질문이 있으므로 의문이 들지만 찾지 못했습니다 .... –
이 글은 비슷하지만 마음에두고있는 것은 아닙니다 : http://stackoverflow.com/questions/574549/ 효율적인 트랜잭션 레코드 잠금 –