2010-02-05 9 views
0

SQL 서버 데이터베이스에 대한 모든 업데이트가 기본 데이터베이스에 적용되기 전에 먼저 T-Log에 추가되었다는 인상을 받았습니다. 서버가 손상된 경우 복원 프로세스는 커밋되지 않은 트랜잭션을 롤백합니다. 이것은 커밋 또는 롤백이 호출되지 않으면 변경 작업이 수행되지 않는 경우에도 트랜잭션과 관련된 작업을 가정했습니다.커밋 또는 롤백없이 DB에 적용되는 트랜잭션 업데이트

SQL Server와 트랜잭션이 거의 다르게 작용하는 것을보고 싶었습니다. 즉 커밋 또는 롤백이없는 트랜잭션 업데이트. 나는 내가 이해하지 못하는 것을 발견했다. 특히 SQL Server가이를 어떻게 허용 할 수 있는지에 대해 설명합니다.

커밋 또는 롤백에 도달하기 전에 트랜잭션을 중지 할 충분한 시간을주기 위해 지연을 사용하여 테이블에 행을 삽입하기 위해 아래 스크립트를 사용했습니다. 이것은 클라이언트 응용 프로그램이 트랜잭션이 완료되기 전에 시간 초과되는 것을 시뮬레이션 한 것이라고 생각합니다.

Create Table MyTest (Comment varchar(20)) 
Go 
Create Procedure MyProc 

as 

Begin Try 
    Begin Transaction 

     Insert Into MyTest Select 'My First Entry' 

     WaitFor Delay '00:00:02' 

     Insert Into MyTest Select 'My Second Entry' 

     WaitFor Delay '00:00:02' 

     Insert Into MyTest Select 'My Third Entry' 

    Commit Transaction 

    Return 0 -- success 
End Try 

Begin Catch 
    If (@@trancount<>0) Rollback Transaction 

    Declare @err int, @err_msg varchar(max) 
    Select @err = error_number(), @err_msg = error_message() 
    Raiserror(@err_msg, 16,1) 

    Return @err 
End Catch 

절차를 얼마나 빨리 중지 하느냐에 따라 첫 번째 또는 두 개의 삽입이 테이블에 남아 있음을 알 수 있습니다. 누군가 이것이 왜 이런 일이 일어날 지 설명 할 수 있을까요?

Select * From MyTest 

나는 SQL에서이 테스트를 2008 년

답변

2

올바른 TXN은 "Write Ahead Logging"을 사용하여 작성됩니다. 이것에 관한 MSDB 기사와 이것이 커밋/롤백/체크 포인트 등과 상호 작용하는 방법

그러나 명령 대기 시간 (또는 수행중인 코드가 단순히 중지됨)에서 TXN은 결코 롤백되지 않으며 연결까지 잠금이 해제됩니다 (또는 나중에 별도로 수행됩니다.) SET XACT_ABORT가 무엇입니까?

1

당신이 트랜잭션을 시작하고 커밋 또는 롤백하지 않으면, 당신은 단순히 무언가가 될 때까지 다른 사용자를 차단할 가능성이 매달려 거래를 얻을 것이다 현재 거래가 끝났습니다. SQL Server는 코드가 그렇게하지 않았기 때문에 트랜잭션을 자동으로 커밋하거나 롤백하지 않습니다. 트랜잭션은 커밋되거나 롤백 될 때까지 제 위치에 유지되고 다른 사용자를 차단합니다.

이제 T-SQL 코드에서 트랜잭션을 시작하거나 커밋하거나 롤백하지 않고 Select 문을 수행하고 Select 문이 사용되는 동안 방금 삽입하거나 업데이트 한 데이터를 볼 수 있습니다 내 거래와 동일한 연결. 다른 트랜잭션을 사용하여 선택을 시도하면 삽입되거나 업데이트 된 데이터가 표시되지 않습니다. 사실 Select 문은 다른 연결의 트랜잭션이 완료 될 때까지 전혀 완료되지 않을 수 있습니다.

관련 문제