2012-12-05 2 views
2

고유 한 숫자 키 생성에 사용되는 테이블이 있습니다. 이 키는 다른 테이블의 PrimaryKey로 사용됩니다. 테이블 구조는 다음과 같이이다 :SQL Server가 UPDATE 트랜잭션을 처리하는 방법은 무엇입니까?

TableName  VARCHAR 
CurrentKey INT 

그래서 우리가

TableName Customers 
CurrentKey 400 

처럼이 테이블에 데이터가 그래서 우리는 테이블 Customers의 향후 기본 키를 필요로 할 때 우리가 TableNameCustomers입니다이 테이블에서 CurrentKey 얻을, 그것은 우리에게 400 증가 (400 + 1) 그것을 줄 것이고 우리는 또한이 키를 테이블에서 업데이트 할 것입니다. 그래서 우리 CurrentKey는 지금 401입니다.

우리는이 목적을 위해 사용하는 SQL은 다음과 같습니다

SQL1 :

DECLARE @CurrentKey INT 
UPDATE myTable 
SET @CurrentKey = CurrentKey = CurrentKey + 1 
WHERE TableName = @TableName 

내 질문은 우리가 테이블을 잠글 필요합니까 여러 사용자가 호출하는 경우 키가 중복되지 않도록이다 이 동시에? 나는 SQL 서버는 중복 데이터를 허용하지 않습니다 확신하지만 난 ... 테이블 잠금으로 쿼리 방법을 모른다 : SQL 서버가 UPDATE을 처리하는 방법을

SQL2

BEGIN TRANSACTION 
    DECLARE @CurrentKey INT 
    UPDATE myTable WITH (TABLOCKX) 
    SET @CurrentKey = CurrentKey = CurrentKey + 1 
    WHERE TableName = @TableName 
END TRANSACTION 

누군가가 설명해 주시겠습니까 전화?

+3

'INT IDENTITY' 열 유형을 사용하여 연속적인 숫자를 처리하려면 SQL Server에 그대로 두어야합니다. **이 일을 독자적으로 시도하지 마라! ** 실패 할 수있는 많은 방법이 너무 많다 .... –

+2

감히 나는'IDENTITY' 열을 다시 발명하려는 이유를 묻는다. 또한 왜 현재 값의 테이블을 중앙 집중식으로 유지 하시겠습니까? 시간 낭비, 아마도 틀렸고 테이블을 직접 쿼리하는 것보다 덜 정확합니다. – Bridge

+0

데이터베이스가 12 살 이상이며 이전 논리를 변경할 수 없습니다! –

답변

1

각 SQL 문은 트랜잭션에서 실행되고 update 문은 항상 잠금을 사용하여 해당 업데이트를 보호합니다. SQL Server에서는 반 수정 된 행을 읽을 수 없습니다 (8k보다 큰 데이터에 대한 예외가 일부 있음).

첫 번째 진술은 괜찮을 것입니다.

관련 문제