데이터베이스에서 가장 중요한 개념 중 하나인 Transaction과 DB 격리수준에 대해 알아보자
Transaction이란 하나의 논리적인 작업 단위를 말한다.
사용자의 입장에서는 하나의 작업이지만, DB에서는 여러 작업이 순서대로 일어나야만 하는 경우가 있다.
가장 대표적인 예로, 통장 입출금을 예로 들 수 있다.
이렇게 세 개의 다른 DB 작업을 하나의 작업으로 묶어 나눠지 않도록 하기 위한 개념이 트랜잭션이다.
## case 1
START TRANSACTION; ## 트랜잭션 시작
UPDATE xxx SET xxx ... ; ## SQL 1
UPDATE xxx SET xxx ... ; ## SQL 2
... ;
COMMIT; ## 지금까지의 작업 내용을 DB에 영구적으로 저장 and transaction 종료
## case 2
START TRANSACTION; ## 트랜잭션 시작
UPDATE xxx SET xxx ... ; ## SQL
... ;
ROLLBACK; ## 지금까지의 작업 모두 취소, transaction 이전으로 되돌린다.
SELECT @@AUTOCOMMIT;
public void transfer(){
try {
Connection connection = ...;
connection.setAutoCommit(false);
... // 데이터 수정
... // 데이터 수정
connection.commit();
}catch (Exception e){
...
connection.rollback();
} finally {
connection.setAutoCommit(true);
}
}
@Transactional
public void transfer(){
... // 데이터 수정
... // 데이터 수정
}
내부 작업은 "하나의 단위"로 처리되어야 한다.
모두 성공 or 모두 실패
ex )
transaction은 DB 상태를 consistent 상태에서 또 다른 consistent 상태로 바꿔줘야 한다.
작업 결과가 DB에 정의된 규칙을 위반한다면 rollback 해야 한다.
DBMS는 commit 전에 rule을 위반했는지 여부를 확인한다.
ex )
여러 transaction이 동시에 실행되는 경우에도 각각 실행되는 것 처럼 동작되어야 한다.
DBMS의 transaction isolation level -> 뒤에 다시 나옴!
ex )
팬텀 리드
, 논 리피터블 리드
, 더티 리드
발생 가능더티 리드
팬텀 리드
, 논 리피터블 리드
발생 가능논 리피터블 리드
팬텀 리드
발생 가능팬텀 리드