https://www.youtube.com/user/newlec1의 내용을 정리해서 포스팅합니다.
[ 트랜잭션이란? ]
트랜잭션(Transaction)은 하나의 작업을 수행하기 위해 필요한 데이터베이스의 연산들을 모아놓은 것으로 업무 실행단위, 논리 명령단위라고 할 수 있다.
트랜잭션에 대해 직관적으로 이해가 되지 않기 때문에 예시를 들어보자.
성호가 은경이한테 돈을 입금한다고 하자.
성호가 은경이한테 돈을 입금하는 순간 성호 계좌와 은경이의 계좌에서 UPDATE 구문이 정상적으로 실행이 되어야 한다.
만약 성호의 UPDATE문이 정상적으로 실행됐으나 은경이의 UPDATE문이 실행되지 않는다면, 성호가 5000원을 이체했으나 은경이가 이를 받지 못해 5000원이 사라지는 모순된 상황이 발생할 것이다.
위의 예시를 통틀어 하나의 트랜잭션이라고 하는 것이다.
가장 중요한 것은 물리적인 명령어 단위를 하나로 묶어서 실행을 해야 한다.
그래서 이러한 물리적인 명령어가 완전하기 전까지는 사용자에게 노출이 되면 안된다.
즉, 현재 세션을 위한 임시 저장소에서 테스트를 진행해야 한다.
그런데 임시 저장소에서 테스트를 하는 도중, 누가 끼어들어 SQL문을 수정하면 어떻게 될까? 분명 난리가 날 것이다.
이렇게 임시 저장소에서 테스트를 할 때 누군가 끼어드는 것을 방지하기 위해 LOCK과 UNLOCK을 사용한다.
LOCK, UNLOCK을 통해 테스트를 할 때 제공받는 명령어가 COMMIT과 ROLLBACK이 있다.
[ COMMIT ]
오라클 서버1과 오라클 서버2가 존재하고 테이블명이 동일하게 MEMBER이고 USER라는 컬럼이 있다고 가정을 해보자.
그리고 USER라는 컬럼에 "KIM"이라는 데이터가 존재한다고 해보자.
만약 서버1의 USER 컬럼에 "LEE"라는 데이터를 INSERT하고 서버2에서 SELECT를 해보면 "KIM"만 출력이 된다.
서버1, 서버2가 각각의 임시 저장소이기 때문에 어떤 변화가 일어났을 때, COMMIT을 해주어야 한다.
서버1에서 COMMIT을 해주고 서버2에서 SELECT를 해보면 "KIM"과 "LEE"가 출력된다.
[ ROLLBACK ]
오라클 서버1과 오라클 서버2가 존재하고 테이블명이 동일하게 MEMBER이고 USER라는 컬럼이 있다고 가정을 해보자.
그리고 USER라는 컬럼에 "KIM"이라는 데이터가 존재한다고 해보자.
오라클 서버1에서 USER 컬럼에 "LEE"라는 데이터를 INSERT 했는데 뭔가 잘못 된거 같아서 취소를 하고 싶다?
그러면 ROLLBACK 구문을 사용하면 된다. 그렇다면 임시 저장소인 오라클 서버1에서 INSERT한 "LEE"가 사라진다.
물론, 서버2는 COMMIT을 하기 전까지는 아무런 영향이 없다.
그런데!!
오라클 서버1에서 USER라는 컬럼에 "LEE"라는 데이터를 INSERT하고 COMMIT을 하기 전에 오라클 서버2에서 USER 컬럼에 "PARK"라는 데이터를 INSERT를 한다면(COMMIT은 안한 상태), 오라클 서버2가 계속해서 진행 상태BAR가 나타난다.
이유는 현재 서버1에 LOCK이 걸려있기 때문이다. 오라클 서버1에서 COMMIT을 하면 서버2의 진행 상태BAR가 종료된다.