MSSQL 2008/MSSQL SQL

SQL - 트랜잭션 제어

본클라쓰 2012. 3. 28. 14:19

 

트랜잭션은 연결 수준에서 관리된다. 한 연결에서 트랜잭션이 시작되면 트랜잭션이 끝날 때까지 해당 연결에서 실행되는 모든 SQL 문은 트랜잭션의 일부가 된다. 일괄 처리가 완료될 때 일괄 처리 범위의 트랜잭션이 커밋되거나 롤백되지 않으면 SQL Server에서 해당 트랜잭션을 자동으로 롤백한다.

 

 

 

트랜잭션의 시작

 

BEGIN TRANSACTION 문을 실행하여 트랜잭션을 시작한다.

 

 

트랜잭션의 종료

 

COMMIT 또는 ROLLBACK 문을 사용하여 트랜잭션을 종료한다.

 

트랜잭션이 성공하면 COMMIT(커밋)한다. COMMIT 문을 사용하면 모든 트랜잭션 수정이 영구적으로 데이터베이스의 일부로 적용된다. COMMIT은 또한 트랜잭션에 사용된 잠금과 같은 리소스를 해제한다.

 

트랜잭션에서 오류가 발생하거나 사용자가 트랜잭션을 취소하려고 결정한 경우 트랜잭션을 롤백한다. ROLLBACK 문은 데이터를 트랜잭션이 시작되기 전 상태로 되돌려서 트랜잭션 진행 중 수정된 모든 내용을 취소한다. ROLLBACK은 또한 트랜잭션에서 보유 중인 리소스를 해제한다.

 

 

 

트랜잭션 처리 중 오류

 

오류로 인해 트랜잭션이 성공적으로 완료되지 않은 경우 SQL Server에서는 자동으로 트랜잭션을 롤백하고 트랜잭션에 보유 중인 모든 리소스를 해제한다. 클라이언트와 데이터베이스 엔진 인스턴스 간의 네트워크 연결이 끊어진 경우 네트워크에 이 인스턴스에게 연결이 끊어진 것을 알릴 때 해당 연결에서 보류 중인 트랜잭션은 모두 롤백된다. 클라이언트 응용 프로그램에 오류가 발생하거나 클라이언트 컴퓨터가 다운 또는 다시 시작되는 경우에도 네트워크 연결은 끊어지고 데이터베이스 엔진 인스턴스는 네트워크에서 연결이 끊어진 것을 확인하면 보류 중인 트랜잭션을 모두 롤백한다.

 

 

 

 

트랜잭션 처리

 

BEGIN TRANSACTION은 연결에서 참조하는 데이터가 논리적, 물리적으로 일관성 있는 시점을 나타낸다. 오류가 발생할 경우 BEGIN TRANSACTION 이후에 발생한 모든 데이터 수정 사항을 롤백하여 데이터를 이러한 일관성 있는 상태로 되돌릴 수 있다. 트랜잭션이 오류 없이 완료되고 COMMIT TRANSACTION이 실행되어 수정 사항이 데이터베이스에 영구히 반영되거나, 오류가 발생하여 ROLLBACK TRANSACTION 문이 모든 수정 사항을 지울 때까지 모든 트랜잭션은 지속된다.

 

BEGIN TRANSACTION은 로컬 트랜잭션을 시작하지만 응용 프로그램에서 INSERT, UPDATE 또는 DELETE 문 실행과 같이 로그에 기록되는 동작을 수행하기 전에 트랜잭션 로그에 기록되지 않는다. 응용 프로그램은 SELECT 문의 트랜잭션 격리 수준을 보호하기 위해 잠금을 확보하는 등의 동작을 수행하지만 수정 동작을 수행할 때까지는 로그에 아무것도 기록되지 않는다.

 

일련의 중첩된 트랜잭션에 속한 여러 트랜잭션을 트랜잭션 이름으로 명명하는 것은 트랜잭션에 큰 영향을 주지 않는다. 가장 바깥쪽의 첫 번재 트랜잭션 이름만 시스템에 등록된다. 유효한 저장점이 이름이 아닌 다른 이름으로 롤백하면 오류가 발생한다. 롤백 이전에 실행된 문은 오류 발생 시 실제로 롤백되지 않고 외부 트랜잭션이 롤백될 경우에만 롤백된다.

 

WITH MARK 옵션을 사용하면 트랜잭션 이름이 트랜잭션 로그에 저장된다. 데이터베이스를 이전 상태로 복원할 때 날자와 시간 대신 표시된 트랜잭션을 사용할 수 있다.

 

 

BEGIN TRAN T1;

 

UPDATE table1 ...;

 

BEGIN TRAN M2 WITH MARK;

 

UPDATE table2 ...;

 

COMMIT TRAN M2;

 

UPDATE table2 ...;

 

COMMIT TRAN T1;