WITH (TABLOCKX)로 프로시저 내에서 테이블 LOCK 하기

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는 아래 사이트에서 참조

[Table Hints (Transact-SQL) MSDN 라이브러리 문서]

글쓴이

BS

BS == Programmer