본문 바로가기
개발언어/SQL

BEGIN TRANSACTION

by 엔돌슨 2008. 1. 8.
반응형

BEGIN TRANSACTION

명시적 로컬 트랜잭션의 시작 위치를 표시합니다. BEGIN TRANSACTION은 @@TRANCOUNT를 1씩 증가시킵니다.

구문

BEGIN TRAN [ SACTION ] [ transaction_name | @tran_name_variable
     [ WITH MARK [ 'description' ] ] ]

인수

transaction_name

트랜잭션에 할당된 이름입니다. transaction_name은 식별자에 대한 규칙을 따라야 하지만 32자 이상인 식별자는 허용되지 않습니다. 중첩된 BEGIN...COMMIT 또는 BEGIN...ROLLBACK 문의 가장 바깥쪽 쌍에서만 트랜잭션 이름을 사용합니다.

@tran_name_variable

유효한 트랜잭션 이름이 포함된 사용자 정의 변수의 이름입니다. 변수는 char, varchar, nchar 또는 nvarchar 데이터 형식으로 선언해야 합니다.

WITH MARK ['description']

로그에 트랜잭션이 표시되도록 지정합니다. description은 표시를 설명하는 문자열입니다.

WITH MARK를 사용할 경우 트랜잭션 이름을 반드시 지정해야 합니다. WITH MARK를 사용하면 명명된 표시에 트랜잭션 로그를 복원할 수 있습니다.

비고

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

BEGIN TRANSACTION은 해당 문을 실행한 연결에 대해 로컬 트랜잭션을 시작합니다. 현재 트랜잭션 격리 수준 설정에 따라, 해당 연결에서 실행한 Transact-SQL 문을 지원하기 위해 획득된 리소스는 COMMIT TRANSACTION 또는 ROLLBACK TRANSACTION 문으로 트랜잭션이 완료될 때까지 잠금 상태가 됩니다. 따라서 오랫동안 완료되지 않은 트랜잭션은 다른 사용자가 리소스를 사용할 수 없도록 잠금 상태를 유지하게 됩니다.

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

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

BEGIN TRANSACTION은 로컬 트랜잭션을 시작합니다. 로컬 트랜잭션을 커밋하거나 롤백하기 전에 다음 작업을 수행하면 분산 트랜잭션으로 수준이 올라갑니다.

  • 연결된 서버에서 원격 테이블을 참조하는 INSERT, DELETE, UPDATE 문을 실행합니다. 연결된 서버를 액세스하는 데 사용되는 OLE DB 공급자가 ITransactionJoin 인터페이스를 지원하지 않으면 INSERT, UPDATE, DELETE 문이 실패합니다.

  • REMOTE_PROC_TRANSACTIONS 옵션이 ON으로 설정된 상태에서 원격 저장 프로시저를 호출합니다.

SQL Server의 로컬 복사본이 트랜잭션 컨트롤러가 되고 MS DTC를 사용하여 분산 트랜잭션을 관리합니다.

표시된 트랜잭션

WITH MARK 옵션을 사용하면 트랜잭션 이름이 트랜잭션 로그에 저장됩니다. 데이터베이스를 이전 상태로 복원할 때 날짜와 시간 대신 표시된 트랜잭션을 사용할 수 있습니다. 자세한 내용은 데이터베이스를 이전 상태로 복원, 명명된 트랜잭션으로 복구, RESTORE를 참조하십시오.

이 외에도 관련된 데이터베이스 집합을 논리적으로 일관성 있는 상태로 복구하려면 트랜잭션 로그 표시가 필수적입니다. 표시는 분산 데이터베이스에 의해 관련된 데이터베이스의 트랜잭션 로그에 저장될 수 있습니다. 이러한 표시에 관련된 데이터베이스 집합을 복구하는 경우, 트랜잭션이 일관된 데이터베이스 집합이 만들어집니다. 관련된 데이터베이스에서 표시의 위치를 정하는 데는 특별한 절차가 필요합니다. 자세한 내용은 관련된 데이터베이스의 백업 및 복구를 참조하십시오.

데이터베이스가 표시된 트랜잭션에 의해 업데이트되는 경우에만 표시가 트랜잭션 로그에 저장됩니다. 데이터를 수정하지 않는 트랜잭션은 표시되지 않습니다.

BEGIN TRAN new_name WITH MARK는 표시되지 않은 기존의 트랜잭션에서 중첩될 수 있습니다. 이러한 작업을 하면 트랜잭션에 이름이 이미 있더라도 new_name이 트랜잭션에 대한 표시 이름이 됩니다. 다음 예제에서 M2는 표시의 이름입니다.

BEGIN TRAN T1
UPDATE table1 ...
BEGIN TRAN M2 WITH MARK
UPDATE table2 ...
SELECT * from table1
COMMIT TRAN M2
UPDATE table3 ...
COMMIT TRAN T1

이미 표시된 트랜잭션을 표시하려고 시도하는 경우에는 오류가 아니라 경고 메시지가 표시됩니다.

BEGIN TRAN T1 WITH MARK
UPDATE table1 ...
BEGIN TRAN M2 WITH MARK

서버: 메시지 3920, 수준 16, 상태 1,  3
WITH MARK 옵션은 첫째 BEGIN TRAN WITH MARK 문에만 적용됩니다.
옵션이 무시됩니다.
사용 권한

BEGIN TRANSACTION 권한은 기본적으로 모든 유효한 사용자에게 부여됩니다.