SQL - 트랜잭션의 특성(Commit, Rollback, Savepoint)

jodbsgh·2022년 7월 10일
0

💾"SQL"

목록 보기
3/5

🧐트랜잭션의 특성에 대해서 알아보자

특징 설명
원자성

(Atomicity)

트랜잭션은 DB연산의 전부가 실행되거나 전혀 실행되지 않아야 한다.(ALL OR NOTHING)

즉, 트랜잭션의 처리가 완전히 끝나지 않았을 경우는 실행되지 않은 상태와 같아야 한다.

일관성

(Consistency)

트랜잭션 실행 결과로 DB상태가 모순되지 않아야 한다.
독립성,격리성

(Isolation)

트랜잭션 실행 중에 생성되는 연산의 중간결과는 다른 트랜잭션이 접근할 수 없다.

즉, 부분적인 실행 결과를 다른 트랜잭션이 볼 수 없다.

영속성, 지속성

(Durability)

트랜잭션이 그 실행을 성공적으로 완료하면 그 결과는 영구적으로 보장이 되어야 한다.

이체는 한 계좌에서 현금이 인출된 후에 다른 계좌로 입금된다.

이 때 현금이 인출되기 전에 계좌에 입금이 될 경우 문제가 발생할 수 있다.
그리고 이체가 결정되기 전 까지는 다른 사람이 이 계좌의 정보를 변경할 수 없다.
이것을 보통 문에 자물쇠를 채우는 것 같다고 하여 잠금(LOCKING)이라고 표현한다.

트랜잭션의 특성(특히 원자성)을 충족하기 위해서 데이터베이스는 다양한 레벨의 잠금 기능을 제공하고 있다.

잠금은 기본적으로 트랜잭션이 수행하는 동안 특정 데이터에 대해서
다른 트랜잭션이 동시에 접근하지 못하도록 제한하는 기법이다.

잠금이 걸린 데이터는 잠금을 실행한 트랜잭션만 독점적으로 접근할 수 있고
다른 트랜잭션으로부터 간섭이나 방해를 받지 않는 것이 보장된다.

그리고 잠금이 걸린 데이터는 잠금을 수행한 트랜잭션만이 해제할 수 있다.


### ✅커밋 (COMMIT) 변경된 데이터를 테이블에 영구적으로 반영하는 것.
  • COMMIT전에는 단지 메모리 Buffer에만 영향을 받았기 때문에, 데이터의 변경 이전 상태로 복구 가능하다.
    => COMMIT후에는 변경사항이 DB에 반영되며, 이전 데이터는 영원히 잃어버리게 된다.
  • 현재 사용자는 SELECT문장으로 결과를 확인 가능하다.
  • COMMIT이전에, 다른 사용자는 현재 사용자가 수행한 명령의 결과를 볼 수 없다.
    => COMMIT이후에, 모든 사용자가 결과를 확인 가능
  • COMMIT이전에, 변경된 행은 잠금(Locking)이 설정되어서 다른 사용자가 변경할 수 없다.
    => COMMIT이후에, 잠금(Locking)이 풀리고 다른 사용자들이 행을 조작할 수 있음.
  • 어플리케이션의 비정상적인 종료 or 이상 종료되어 DB접속이 단절되었을 때는 자동으로 ROLLBACK.

✅롤백 (ROLLBACK)

테이블 내 입력한 데이터나, 수정한 데이터, 삭제한 데이터에 대하여 COMMIT이전에는 변경사항을 취소할 수 있다.

그 것을 바로 롤백(ROLLBACK)이라고 한다. 롤백은 데이터 변경 사항이 취소되어 데이터 이전 상태로 복구되며, 관련된 행에 대한 잠금(Locking)이 풀리고 다른 사용자들이 데이터 변경을 할 수 있게 됨을 의미한다.

✅저장점 (SAVEPOINT)

저장점(SAVEPOINT)을 정의하면 롤백(ROLLBACK)할 때 트랜잭션에 포함된 전체 작업을 롤백하는 것이 아니라, 현 시점에서 SAVEPOINT까지 트랜잭션의 일부만 롤백할 수 있다.

따라서 복잡한 대규모 트랜잭션에서 에러가 발생했을 때 SAVEPOINT까지의 트랜잭션만 롱백하고 실패한 부분에 대해서만 다시 실행할 수 있다.

(일부 툴에서는 지원이 안될 수 있다.)

복수의 SAVEPOINT를 정의할 수 있으며, 동일한 이름으로 SAVEPOINT를 정의했을 때는 나중에 정의한 저장점이 유효하다.

저장점(SAVEPOINT)을 정의하는 방법

  
 	 SAVEPOINT SVPT1;
  

저장점(SAVEPOINT)까지 롤백(ROLLBACK)할 때는 ROLLBACK키워드 뒤에 SAVEPOINT 명을 지정하면 된다.

  
 	 ROLLBACK TO SVPT1;
  

위 그림에서 보듯이, 저장점 A로 되돌리고 나서 다시 B와 같이 미래 방향으로 되돌릴 수는 없다.

일단 특정 저장점까지 롤백하면 그 저장점 이후에 설정한 저장점이 무효가 되기 때문이다.

즉, ROLLBACK TO A를 실행한 시점에서 저장점 A이후에 정의한 저장점 B는 존재하지 않는다. 저장점 지정 없이 ROLLBACK을 실행했을 경우 반영안된 모든 변경 사항을 취소하고 트랜잭션 시작 위치로 되돌아간다.

profile
어제 보다는 내일을, 내일 보다는 오늘을 🚀

0개의 댓글