데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위
데이터베이스의 상태를 변화시킨다는 것은 무엇을 의미할까?
질의어(SQL)를 이용하여 데이터베이스를 접근 하는 것
=> SELECT, INSERT, DELETE, UPDATE
게시판을 예로 들어보자!
게시판 사용자는 게시글을 작성하고, 올리기 버튼을 누름, 다시 게시판으로 돌아왔을때, 자신의 글이 포함된 업데이트된 게시판을 보게됨.
- DB작업으로 옮겨보면
- 사용자가 올리기 버튼을 누를때 => INSERT문 으로 입력한 게시글의 DATA를 옮김
- 게시판을 구성할 데이터 => 데이터를 SELECT 하여 최신 정보로 유지.
=> 여기서 작업단위는 insert + select 합친것
위에서 말한 하나의 작업단위를 트랜잭션이라고 함
하나의 트랜잭션 설계를 잘하는 것이 데이터를 다루는 것에 많은 이점이 있다!!
그러면 이 트랜잭션을 사용하는 이유는 뭘까?..
은행 계좌 이체 업무를 예시로 들어보자.
- A은행에서 B은행으로 돈을 계좌 이체 하려고 함
- 송금하는 도중 알수 없는 오류가 발생. 그결과, A은행에서 돈은 빠져나갔지만 B은행 계좌에는 입금되지 않는 일이 발생
이러한 상황이 발생하면 어떻게 할것 인지, 어떻게 해결하면 좋을지 한번 생각해보자. => 트랜잭션
당연하게 거래가 완전히 끝나면 승인되게 하면 된다. 그렇게 하면 중간에 오류가 발생해도 거래를 시작하기전으로 되돌릴 수 있게 된다.
여기서 승인이 Commit / 되돌리는 것이 Rollback
하나의 트랜잭션이 성공적으로 끝나서 DB가 일관성이 있는 상태에 있음을 의미
하나의 트랜잭션 처리가 비정상적으로 종료되어 원자성이 깨진상태를 의미.
-> 원자성을 지키기 위해 트랜잭션이 행한 모든 연산을 재시작하거나 취소( Undo )함
커밋과 롤백 덕분에 데이터의 변경사항을 쉽게 확인 할 수 있고 해당 작업을 그룹화 할수 있게 됨!
은행거래로 다시 돌아가 보자.
A은행 에서 B은행으로 송금해서 완전한 거래를 하는 것을 하나의 논리적 단위라고 말할 수 있다! ( Commit )
=> 그래서 이 논리적 단위인 트랜잭션이 필요함!!
트랜잭션이 성공적으로 처리되어 DB의 무결성과 일관성을 보장하려면 4가지 특성을 만족해야 함
- 원자성 ( Acid )
- 일관성 ( Consistency )
- 독립성 ( Isolation )
- 지속성 ( Durability )
다들 익히 알고 있는것들이므로 넘어가고
실제로는 ACID 원칙은 종종 지켜지지 않음 => ACID 원칙을 엄격하게 지키게 되면 동시성이 매우 떨어지기 때문
따라서 각 level 별 transaction lock level이 존재 (링크 참고)