TCL(TraTransaction Control Language)
Transaction(트랜잭션)
- 데이터베이스의 논리적 연산단위
- 밀접히 관련되어 분리될 수 없는 한 개 이상의 데이터베이스 조작
- 하나의 트랜잭션에는 하나 이상의 SQL 문장이 포함된다.
- 분할할 수 없는 최소의 단위
- 그렇기 때문에 전부 적용하거나 전부 취소한다.
- All Or Nothing의 개념
* 올바르게 반된 데이터를 데이터베이스에 반영시키는 것(COMMIT)
* 트랜잭션 시작 이전의 상태로 되돌리는 것(ROLLBACK)
* 저장점기능(SAVEPOINT)
트랜잭션의 특성
특성 |
설명 |
원자성 |
트랜잭션에서 정의된 연산자들은 모두 성공적으로 실행되던지 아니면 전혀 실행되지 않은 상태로 남아 있어야 한다.(All or Nothing) |
일관성 |
트랜잭션이 실행되기 전의 데이터베이스 내용이 잘못 되어 있지 않다면 트랜잭션이 실행된 이후에도 데이터베이스의 내용에 잘못이 있으면 안된다. |
고립성 |
트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안된다. |
지속성 |
트랜잭션이 성공적으로 수행되면 그 트랜잭션이 갱신한 데이터베이스의 내용은 영구적으로 저장된다. |
추가 사항.
- 트랜잭션의 특성을 충족하기 위해 데이터베이스는 다양한 레벨의 잠금 기능을 제공하고 있는데, 잠금은 기본적으로 트랜잭션이 수행하는 동안 특정 데이터에 대해서 다른 트랜잭션이 동시에 접근하지 못하도록 제한하는 기법이다.
- 잠금이 걸린 데이터는 잠금을 실행한 트랜잭션만 독점적으로 접근할 수 있고 다른 트랜잭션으로부터 간섭이나 방해를 받지 않는 것이 보장된다. 그리고 잠금이 걸린 데이터는 잠금을 수행한 트랜잭션만이 해제할 수 있다.
COMMIT
- 입력한 자료나 수정한 자료에 대해서 또는 삭제한 자료에 대해서 전혀 문제가 없다고 판단되었을 경우 COMMIT 명령어를 통해 트랜잭션을 완료할 수 있다.
COMMIT 이나 ROLLBACK 이전의 데이터 상태
- 단지 메모리 Buffer에만 영향을 받았기 때문에 데이터의 변경 이전 상태로 복구 가능하다.
- 현재 사용자는 SELECT 문장으로 결과를 확인할 수 있다.
- 다른 사용자는 현재 사용자가 수행한 명령의 결과를 볼 수 없다.
- 변경된 행은 잡금(Locking)이 설정되어서 다른 사용자가 변경할 수 없다.
Caution(주의!!).
Oracle은 Commit을 하나하나 해줘야 하지만 SQL Server는 자동 Commit이 된다.
COMMIT 이나 ROLLBACK 이후의 데이터 상태
- 데이터에 대한 변경 사항이 데이터베이스에 반영된다.
- 이전 데이터는 영원히 잃어버리게 된다.
- 모든 사용자는 결과를 볼 수 있다.
- 관련된 행에 대한 잠금(Locking)이 풀리고, 다른 사용자들이 행을 조작할 수 있게 된다.
SQL Server에서의 트랜잭션
1) Auto Commit
- SQL server의 기본 방식이며, DML, DDL을 수행할 때마다 DBMS가 트랜잭션을 컨트롤 하는 방식이다. 명령어가 성공적으로 수행되면 자동으로 COMMIT을 수행하고 오류가 발생하면 자동으로 ROLLBACK을 수행한다.
2) 암시적 트랜잭션
- 트랜잭션의 시작은 DBMS가 처리하고 트랜잭션의 끝은 사용자가 명시적으로 Commit 또는 Rollback으로 처리한다. 인스턴스 단위 또는 세션 단위로 설정할 수 있다. 인스턴스 단위로 설정하려면 서버 속성 창의 연결화면에서 기본연결 옵션 중 암시적 트랜잭션에 체크를 해주면 된다. 세션 단위로 설정하기 위해서는 세션 옵션중 SET IMPLCIT TRANSACTION ON을 사용하면 된다.
3) 명시적 트랜잭션
- 트랜잭션의 시작과 끝을 모두 사용자가 명시적으로 지정하는 방식
ROLLBACK
-> 테이블 내 입력한 데이터나, 수정한 데이터, 삭제한 데이터데 대하여 Commit 이전에는 변경 사항을 취소 할 수 있는 명령어를 말한다.
-> 데이터 변경 사항이 취소되어 데이터의 이전 상태로 복구되며, 관련된 행에 대한 잠금(Locking)이풀리고 다른 사용자들이 데이터 변경을 할 수 있게 된다.
ROLLBACK 후의 데이터 상태
- 데이터에 대한 변경 사항은 취소 된다.
- 이전 데이터는 다시 재저장된다.
- 관련된 행에 대한 잠금이 풀리고, 다른 사용자들이 행을 조작할 수 있게 된다.
COMMIT과 ROLLBACK을 사용함으로써 얻는 효과
- 데이터 무결성 보장
- 영구적인 변경을 하기 전에 데이터의 변경 사항 확인 가능
- 논리적으로 연관된 작업을 그룹핑하여 처리 가능
SQL 이용한 예시(그림 설명)
Caution(주의!!).
- 필자가 한번 적용을 해본 결과 잘 됩니다.
- 그렇지만 데이터 내용을 지우고 하는것은 transaction이 잘 적용 되지만 Column을 지워보고 적용해본 결과 Column은 Rollback이 되지 않으므로 조심하시기를 바랍니다.
SAVEPOINT
- SavePoint를 정의하면 Rollback할 때 Transaction에 포함된 전체 작업을 롤백하는 것이 아니라 현시점에서 SavePoint까지 트랜잭션의 일부만 롤백할 수 있다.
- 복수의 저장점을 정희할 수 있으며, 동일이름으로 저장점을 정의했을 때는 나중에 정의한 저장점이 유효하다.
SAVEPOINT t1; |
사용법 예시.(사진이 한장으로 안되어서 연속으로 뿌립니다.)
Rollback의 원리
Caution(주의!!).
- 위 그림에서 보듯이 SavePoint t1 으로 되돌리고 나서 다시 t2와 같이 미래 방향으로 되돌릴 수는 없다.
- 일단 특정 저장점까지 Rollback하면 그 저장점 이후에 설정한 저장점이 무효가 되기 때문이다.
- 즉, "Rollback to t1"을 실행한 시점에서 t1이후에 정의한 SavePoint t2는 존재하지 않는다.
Arrange.
- Transaction은 해당 테이블에 데이터의 변경을 발생시키는 입력, 수정, 삭제 수행시 그 변경되는 테이터의 무결성을 보장하는 것이 Commit과 Rollback의 목적이다.
- Commit은 "변경된 데이터를 테이블이 영구적으로 반영하는 것,"
- Rollback은 "병경된 데이터가 문제가 있으니 변경 전 데이터로 복귀 하라는 것,"
- SavePoint는 "데이터 변경을 사전에 지정한 지점까지만 롤백하라."
- DDL문장을 실행하면 그 전후 시점에 자동으로 Commit된다.(SQL server)
- DDL문장 이후에 Commit 없이 DDL 문장이 실행되면 DDL 수행 전에 자동으로 Commit된다.
- 데이터베이스를 정상적으로 접속을 종료하면 자동으로 트랜잭션이 Commit된다.
- 어플의 이상 종료로 데이터베이스와의 접속이 단절되었을 때는 트랜잭션이 자동으로 Rollback된다.
'IT > SQLD(SQL개발자)' 카테고리의 다른 글
[SQLD] 함수(Function) (0) | 2019.06.28 |
---|---|
[SQLD] WHERE (0) | 2019.06.27 |
[SQLD] DML(Data Manipulation Language) (0) | 2019.06.24 |
[SQLD] DDL(Data Definition Language) (0) | 2019.06.23 |
[SQLD] 관계형 데이터베이스 개요 (0) | 2019.06.22 |