본문 바로가기

데이터베이스

트랜잭션, COMMIT과 ROLLBACK에 대하여

https://wonit.tistory.com/462

요약.
1. 트랜잭션의 특성 ACID

2. 왜 트랜잭션이 필요한가? DB의 상태를 변화시키는 작업은 하나의 쿼리로 이루어 질수 없고 서로 연관성있는 다수의 쿼리들이 반드시 함께 다루어져야 하기 때문이다.

트랜잭션이란?

데이터베이스의 상태를 변화시키기 위해 내가 정한 작업의 단위.

 

하나의 트랜잭션은 Commit (저장) 되거나 Rollback (철회)될 수 있다.

작업단위는 많은 질의어 명령문들을 사람이 정하는 기준에 따라 정하는 것을 의미한다.

게시판을 예로 들어보자. 

게시판 사용자는 게시글을 작성하고, 올리기 버튼을 누른다. 그 후에 다시 게시판에 돌아왔을때, 

게시판은 자신의 글이 포함된 업데이트된 게시판을 보게 된다. 이러한 상황을 데이터베이스 작업으로 옮기면, 사용자가 올리기 버튼을 눌렀을 시, Insert 문을 사용하여 사용자가 입력한 게시글의 데이터를 옮긴다. 그 후에, 게시판을 구성할 데이터를 다시 Select 하여 최신 정보로 유지한다. 여기서 작업의 단위는 insert문과 select문 둘다 를 합친것이다. 이러한 작업단위를 하나의 트랜잭션이라 한다.

 

트랜잭션의 특징


 트랜잭션의 특징은 크게 4가지로 구분된다. 

 

  • 원자성 (Atomicity)
  • 일관성 (Consistency)
  • 독립성 (Isolation)
  • 지속성 (Durability)

 첫번째로, 원자성은 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 것이다.  트랜잭션은 사람이 설계한 논리적인 작업 단위로서, 일처리는 작업단위 별로 이루어 져야 사람이 다루는데 무리가 없다.

(만약 트랜잭션 단위로 데이터가 처리되지 않는다면, 설계한 사람은 데이터 처리 시스템을 이해하기 힘들 뿐만 아니라, 오작동 했을시 원인을 찾기가 매우 힘들어질것이다)

 

 두번째로, 일관성은 트랜잭션이 진행되는 동안에 데이터베이스가 변경 되더라도 업데이트된 데이터베이스로 트랜잭션이 진행되는것이 아니라, 처음에 트랜잭션을 진행 하기 위해 참조한 데이터베이스로 진행된다. 이렇게 함으로써 각 사용자는 일관성 있는 데이터를 볼 수 있는 것이다.

 

 세번째로, 독립성은 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다는 점을 가리킨다.

네번째로, 지속성은 트랜잭션이 성공적으로 완료됬을 경우, 결과는 영구적으로 반영되어야 한다는 것이다.

 

가장 핵심적으로 기억해야 할말!!

==> 트랜잭션 내의 DML 명령문들은 실행이 되어 SELECT -FROM 결과에 반영되더라도, 커밋(COMMIT) 전까지는 임시적인 상태입니다.

하나의 트랜잭션은 Commit (저장) 되거나 Rollback (철회)될 수 있다.

따라서, 아직 COOMIT되지 않은 트랜잭션 처리중인 상태에서는 ROLLBACK을 할 경우 트랜잭션이 취소되고 이전 커밋 직후의 상태로 돌아가게 됩니다.

출처: https://m.blog.naver.com/regenesis90/222213840145

 

(트랜잭션 내의 DML 명령문들은 실행이 되어 SELECT -FROM 결과에 반영되더라도, 커밋(COMMIT) 전까지는 임시적인 상태입니다. 이말을 전제로한다)
@Transactional어노테이션을 사용하여 쿼리를 날려주면 select쿼리로 db에 영향을 끼친것까지 확인할 수 있지만 그것은 실제 DB에 진자로 반영된 것이 아닌 임시상태임!
And 이러한 Transactional의 성격을 가진 어노테이션을 사용함으로써 Junit은 테스트를 반복적으로 할수 있는 것임. Junit의 장점은 반복적 테스트의 적용과 여러테스를  한번에 할 수 있다는 것임

 

출처: https://rays-space.tistory.com/30

 

왜 트랜잭션이 필요한가? DB의 상태를 변화시키는 작업은 하나의 쿼리로 이루어 질수 없고 서로 연관성있는 다수의 쿼리들이 반드시 함께 다루어져야 하기 때문이다.

예를들면 아래와 같은 상황을 생각해 볼수 있다.

트랜잭션은 연산과정의 집합입니다. 즉, DB의 상태를 변화시키기 위한 작업에 포함된 모든 연산이 모두 성공적으로 수행될 수도 있지만 그렇지 않을 수도 있습니다. 이러한 경우를 위해 연산의 집합인 트랜잭션으로 관리 하는 것입니다. 예를 들어, A계좌에서 B계좌로 금액을 이체하는 작업을 진행중에 A계좌에서 이체할 금액을 빼고 저장했습니다. 그러나 그 다음에 예기치 못한상황으로 중단되어 B계좌에 금액을 추가 저장하지 못했습니다. 이러한 상황을 트랜잭션으로 통합관리하지 않는다면, A계좌에서 빠진 금액이 증발해버리고 맙니다. 따라서 이러한 상황을 방지하기 위해 ACID 성질을 갖는 트랜잭션을 사용하는 것입니다.