2014-07-21 4 views
0

내에서 고정 I가 다음 TRANSACTION 구조 : 나는 아무도이 거래 내의 모든 진술하지 않는 이상이다 local_table_1의 내용을 읽을 수 없습니다 있는지 확인하려면TSQL 2012 - 테이블 TRANSACTION

BEGIN TRY 
BEGIN tran sometransaction 
    INSERT INTO local_table_1 (columns...) 
     SELECT (columns...) 
     FROM remote_table 
     WHERE (conditions, predicates) 

    UPDATE local_table_1 
    SET column_A = value 
    WHERE.... 

    UPDATE local_table_1 
    SET column_B = value 
    WHERE.... 

    UPDATE local_table_1 
    SET column_C = value 
    WHERE.... 

    COMMIT tran sometransaction 
END TRY 
BEGIN catch 
    ROLLBACK tran sometransaction  
END catch 

및 저 지르다.

전체 거래에서 WITH (TABLOCKX, HOLDLOCK)을 설정하는 방법이 있습니까? 트랜잭션 실행 중에 테이블이 자동으로 잠기는 것을 이해하지만 외부 동시 읽기 프로세스로 확장되는 경우 설명을 찾을 수 없습니다.

감사합니다.

+1

왜 전체 테이블을 잠글 필요가 있습니까? SQL Server는 전체 테이블을 단일 행으로 업데이트하는 것을 방지하기 위해 잠금 에스컬레이션을 내장했습니다. –

+0

글쎄 ... 그게 전부 야, 나는 전체 트랜잭션의 지속 기간 동안 방지하려고하는 외부 읽기를 제외하고이 테이블에 대해 실행중인 다른 프로세스가 없다는 것을 알고있다. 트랜잭션은 다음과 같이 진행됩니다 : 10,000 개의 레코드를 로컬 테이블에 복사하고 모든 10,000 개의 레코드를 3x - 3 가지 다른 업데이트 문으로 업데이트하십시오.) 누군가가 해당 업데이트 문 사이에서 테이블을 읽으려고하면 업데이트되지 않은 데이터를 가져옵니다. – Milan

+1

제 질문은 이러한 다른 프로세스가 테이블을 읽을 수없는 이유는 무엇입니까? NOLOCK을 사용하거나 UNCOMMITTED를 사용하지 않는 한이 프로세스는 커밋 될 때까지 변경 사항을 볼 수 없습니다. –

답변

0

다음 링크는 설명과 예제가 실려있다. 이것은 모두 sql의 ACID 속성과 관련하여 격리와 관련이 있습니다. http://en.wikipedia.org/wiki/ACID

0

트랜잭션을 시작하기 전에 트랜잭션 격리 수준을 READ COMMITTED 또는 REPEATABLE READ로 설정하십시오. 외부 프로세스가 외부 프로세스가 NOLOCK 힌트를 사용하지 않는 커밋되지 않은 트랜잭션을 읽거나 UNCOMMITTED 격리를 읽지 않습니다

http://msdn.microsoft.com/en-us/library/ms173763.aspx

+0

.. 감사합니다. 나는 게시하기 전에이 MS 게시물을 읽었지만 다음 내용을 설명합니다. "명령문이 수정되었지만 다른 트랜잭션에 의해 커밋되지 않은 데이터를 읽을 수 없도록 지정합니다." 그것은 나에게있어 다른 소스에서 트랜잭션의 격리 수준 (어떤 트랜잭션이 액세스 할 수 있는지)을 설정하고 트랜잭션 자체를 격리하지 않는 것으로 보입니다. – Milan