= Transaction Control Language = {{tag>SQL Database}} = 기본 개념 = == Transaction? == * "밀접히 연관되어 분리될 수 없는 한 개 이상의 DB 조작"으로 "DB의 논리적 연산단위" * 분할할 수 없는 최소 단위 → **All or Nothing** * 하나의 Transaction에는 하나 이상의 SQL문 포함 → TCL의 대상이 되는 SQL문은 **DML** === 특성 === * **Atomicity** : All or Nothing(성공적 실행 or 그대로 유지) * **Consistency** : Transaction 실행되기 전 DB 내용 잘못X → 실행 후에도 잘못X * **Isolation** : Transaction 실행 도중 다른 Transaction 영향X * **Durability** : Transaction 수행 성공 → DB 내용 영구적 저장 == TCL == === 효과 (Why use?) === * 데이터 무결성 보장 * 영구적인 변경을 하기 전에 데이터 변경 사항 확인 가능 * 논리적으로 연관된 작업을 그룹 지어 처리 가능 === TCL 수행 이전의 데이터 상태 === * 단지 Memory Buffer에만 영향을 받았기 때문에 데이터의 변경 이전 상태로 복구 가능. * 현재 사용자는 SELECT문으로 결과 확인 가능, 다른 사용자는 현재 사용자가 수행한 명령 결과 확인 불가. * 변경된 행은 Locking 설정되어 다른 사용자가 변경 불가. === TCL을 실행하지 않아도 자동 수행 후 Transaction이 종료되는 경우 === * **DDL**문 실행하면 자동 **COMMIT**. (☞ 당연한 이야기지만, DML문 → DDL문 실행하면 DML에서 COMMIT 없이 자동 COMMIT.) * DB **정상 종료**하면 자동 **COMMIT**. * Application **이상 종료**로 DB(Instance) 접속 단절되는 경우 자동 **ROLLBACK**. == SQL Server에서의 3가지 Transaction 처리 방식 == * AUTO COMMIT : SQL Server의 기본 방식. DML/DDL을 실행할 때마다 __**DBMS**가 **자동**으로__ Transaction 제어하는 방식. (성공=Commit or 실패=Rollback 자동 수행.) * 암시적 Transaction : Transaction __**시작**은 **DBMS**가__, __**끝**은 **사용자가**__ 명시적으로 **COMMIT** / **ROLLBACK** 처리하는 방식. (Oracle과 동일) * 명시적 Transaction : Transaction __**시작**, **끝** 모두 **사용자**가__ 명시적으로 지정하는 방식 = 문법 = == COMMIT == **"변경된 Data를 Table에 영구적으로 반영해라"** DML문 COMMIT; --SQL Server는 Auto Commit이라 필요X == ROLLBACK == **"변경된 Data가 문제 있으니 변경 전 데이터로 복귀시켜라"** DML문 ROLLBACK; === SAVEPOINT === **"Data 변경을 사전에 지정한 저장점까지만 ROLLBACK하라"** * 현 시점에서 저장점(Save Point)까지 전체 Transaction의 일부만 ROLLBACK 할 경우 사용 (= 복잡한 대규모 Transaction일 때 적합!) * 동일 이름 지정시 **가장 최근 저장점**이 유효. * 특정 저장점에서 ROLLBACK 수행 **이후** 저장점은 **무효**. * 저장점 없이 ROLLBACK 수행 후에는 Transaction 시작 위치로 되돌아간다. (당연한 이야기!) SAVEPOINT SVPT1; DML문 ROLLBACK TO SVPT1; /* SQL Server SAVE TRANSACTION SVPT1; -- TRANSACTION 대신 TRAN 대체 가능 DML문 ROLLBACK TRANSACTION SVPT1; -- TRANSACTION 대신 TRAN 대체 가능 */