하나의 작업 단위로, 데이터베이스의 일관성을 유지하기 위해 수행되는 작업의 집합
| 특성 | 설명 |
|---|---|
| 원자성 (Atomicity) | 트랜잭션이 완전히 성공하거나 완전히 실패하는 단일 단위로 처리되도록 보장 |
| 일관성 (Consistency) | 무결성 제약조건처럼 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지하며, 트랜잭션이 영향을 받는 데이터를 허용된 방식으로만 변경해야 함. |
| 격리성 (Isolation) | 병행되는(동시 실행) 트랜잭션들이 서로 독립적으로 수행되어, 서로에게 영향을 미치지 않도록 각각 격리. 동시에 같은 리소스를 작업하지 않게 만듦. |
| 지속성 (Durability) | 트랜잭션이 성공하면 그 결과가 기록되어야 하며, 데이터가 영구적으로 저장(persistence)됨. |
트랜잭션은 위 ACID 조건을 지키며 데이터에 대한 변경을 수행한다.
여러 작업을 하나의 작업 단위로 묶어 트랜잭션 처리를 해야할 때 클래스 혹은 메서드에 선언하여 트랜잭션을 적용한다.
@Transactional
public class UserService {
// 클래스 내 모든 메서드 트랜잭션 적용
}
| 속성 | 타입 | 설명 |
|---|---|---|
value |
String |
사용할 트랜잭션 관리자 |
propagation |
enum: Propagation |
트랜잭션 전파 방식 설정 |
isolation |
enum: Isolation |
격리 수준 설정 |
readOnly |
boolean |
read-only 트랜잭션인지 아닌지를 결정 |
timeout |
int |
트랜잭션 작업 시간 제한을 설정 |
rollbackFor |
Throwable 로부터 얻을 수 있는 Class 객체 배열 |
롤백이 수행되어야 하는 특정 예외 지정 |
rollbackForClassName |
Throwable 로부터 얻을 수 있는 클래스 이름 배열 |
롤백이 수행되어야 하는, 선택적인 예외 클래스 이름의 배열 |
| noRollbackFor | Throwable 로부터 얻을 수 있는 Class 객체 배열 | 롤백이 수행되지 않아야 하는, 선택적인 예외 클래스의 배열 |
| noRollbackForClassName | Throwable 로부터 얻을 수 있는 클래스 이름 배열 | 롤백이 수행되지 않아야 하는, 선택적인 예외 클래스 이름의 배열 |
@Transactional(propagation = Propagation.REQUIRED)
public void outerMethod() {
innerMethod();
// innerMethod가 outerMethod와 같은 트랜잭션 사용
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void innerMethod() {
// 기존 트랜잭션은 중단하고 새로운 트랜잭션 생성
}