앞선 포스트에서 노원구 주민 테이블을 가지고 이야기 했으니, 편의상 요번에도 주민 테이블을 가지고 예를 들어 보겠다..

 

상황은 이렇다.. 어느날 노원구에서 살고 있던 수지가 동작구로 이사를 간다고 했다. 이것을 테이블 관점에서 본다면, 노원구 주민 테이블에서 수지를 빼고, 동작구 주민 테이블에 수지를 넣는 작업이 진행되어야 한다.

 

1 DELETE FROM 노원구 주민 테이블 WHERE 주민테이블.주민이름='수지';

2 INSERT INTO 동작구 주민 테이블 VALUES ('수지');

 

그런데 이런 상황이 발생해 버리면 어떨까?

1번 상황을 진행하는 동안 알수 없는 에러로 1번줄을 수행하지 못하고 2번과정으로 넘어가 동작구 주민 테이블에 수지가 추가되었다. 그러면 이제 가상의 수지 한명이 동작구에 살게 된다. 그러나 이 동작구 수지의 실체는 없다.

 

뭐 이런건 단순한 실수로 넘어가 줄 수 있겠지만, 은행이라면 어떨까? 잘못된 오류의 금액이 몇억원이라면?

 

이런 문제점을 해결하기 위해 TRANSACTION은 복수의 명령어로 이뤄진 쿼리를 모두 실행하고 오류가 없을 때 비로소 실제 DB에 적용한다. 실행 도중에 하나의 오류라도 발견되면, 전체 과정중 일부가 성공했다 하더라도 실제 DB에는 반영하지 않는다.

 

따라서 동시에 진행되는 TRANSACTION작업은 서로에 의한 처리 결과를 처리가 완료되기 이전에 볼 수 없다. 일련의 모든 작업이 성공으로 끝나고 COMMIT이 이뤄 질 때 비로소 처리 결과가 DB에 반영되어 다른 작업들도 이 반영된 결과를 볼 수 있다.

 

Postgresql에서는 "BEGIN"과 "COMMIT"이라는 단어로 query를 감싸므로써 이런 TRANSACTION 기능을 사용 할 수 있다.

 

 

 

 

 

Posted by 굿쟌
,