IT/SQLD(SQL개발자)

[SQLD] TCL (Transaction Control Language)

pandada 2019. 6. 26. 12:50
반응형

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 이용한 예시(그림 설명)

< Rollback 예시 화면 >

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