트랜잭션
- 데이터베이스의 상태를 변경하는 하나의 논리적인 작업 단위
- 논리적인 이유로 여러 SQL문을 단일 작업으로 묶어서 나눠질 수 없게 만든 것
- 트랜잭션의 일부만 성공해서 DB에 반영되는 일은 일어나지 않는다.
COMMIT
- 지금까지 작업한 내용을 DB에 영구적으로 저장
- transaction을 종료
ROLLBACK
- 지금까지 작업을 모두 취소하고 transcation 이전 상태로 되돌린다.
- transcation을 종료
AUTOCOMMIT
- 각각의 SQL문을 자동으로 transcation 처리 해주는 개념
- SQL문이 성공적으로 실행하면 자동으로 COMMIT
- 실행 중 문제가 있었다면 자동으로 ROLLBACK
- MySQL의 default -> autocommit enabled
- 다른 DBMS도 대부분 같은 기능 제공
START TRANSACTION
실행과 동시에 autocommit은 off
- 트랜잭션이 종료되면 autocommit한 상태로 돌아간다
일반적인 트랜잭션 사용 패턴
- 트랜잭션 시작
- 데이터를 읽거나 쓰는 등의 SQL문을 포함해서 로직 수행
- 과정에 문제가 없었다면 트랜잭션 COMMIT
- 문제가 발생했다면 ROLLBACK
public void transfer(String fromId, String told, int amount){
try{
Connection connection = ...;
conmnection.setAutoCommit(false);
...
...
}catch (Exeption e){
...
connection.rollback();
...
}finally {
connection.setAutoCommit(true);
}
}
이러한 형태로 동작한다. 스프링에서는 사용자가 커넥션을 연결하고 commit 또는 rollback하는 것에 신경쓰지 않고 로직에 집중할 수 있도록 @Transactional
을 지원한다.
@Transactional
public void transfer(String fromId, String told, int amount){
...
}
ACID
- 트랜잭션이 지니는 성질
- 개발자는 언제 commit, rollback 할지를 챙겨야 함
Atomic
- All or NOTHING
- 트랜잭션은 논리적으로 쪼깨질 수 없는 작업단위로, 모두 실패하거나 모두 성공해야 한다.
Consistency
- 트랜잭션은 consistent한 상태에서 또다른 consistent상태로 바꿔주어야 한다.
- constraint, trigger 등을 통해 DB에 정의된 rule을 위반하면 rollback해야 한다.
- 이는 DBMS가 commit전에 확인하고 알려준다.
Isolation
- 여러 transaction들이 동시에 실행될 때도 혼자 실행되는 것처럼 동작하게 만든다.
- isolation을 엄격하게 구현하면 DB성능이 저하되므로 여러 종류의 isolation level을 제공한다.
- concurrency control의 주된 목표가 isolation이다.
Durability
- commit된 transaction은 DB에 영구적으로 저장된다(비휘발성 메모리에 저장함).
- DB에 문제가 생겨도 commit된 내용이 남아 있어야 한다.
참고 사항
- transaction을 어떻게 정의해서 사용하는지는 개발자의 몫이므로 구현 기능와 ACID 속성을 잘 이해해야 한다.