struct TableA { int FieldA; CRITICAL_SECTION cs; }; void func(TableA& ta) { EnterCriticalSection(&ta.cs); if (ta.fieldA == 0) ta.fieldA = 1; else ta.fieldB = 0; LeaveCriticalSection(&ta.cs); }
위와 같은 C++ 코드와 동일한 MS SQL Server의 프로시저를 만든다면???
CPU를 최대한 사용해서
UPDATE 이후에 @@ROWCOUNT를 가지고 결과를 보고
원하는대로 되지 않으면 다시 루프… 이런 spin lock과 유사한 방법도 있겠지만…
역시 Lock을 하는 것이 깔끔 하겠죠?
CREATE PROCEDURE [func] AS BEGIN SET NOCOUNT ON; DECLARE @curval INT; BEGIN TRANSACTION; SELECT @curval = [FieldA] FROM [TableA] WITH (TABLOCKX); IF @curval = 0 UPDATE [TableA] SET [FieldA]=1; ELSE UPDATE [TableA] SET [FieldA]=0; COMMIT TRANSACTION; END
위에 코드는 단순 샘플로 테이블에 데이터가 1개 존재한다는 것을 가정하고 있습니다.
SELECT나 UPDATE문의 WITH 절에 TABLOCKX 을 가지고 테이블을 LOCK 하게 되면 다른 트랜잭션에서 수정할 수 없으므로
이어지는 IF 문에서 안전하게 현재 값을 가지고 처리를 할 수 있습니다.
또다른 LOCK 형식이나 다른 Table Hints는 아래 사이트에서 참조