-
[Spring] @Transactional[Spring] 2024. 5. 27. 23:38
트랜잭션(Transaction) 이란 ?
데이터베이스 작업의 단위로 , 여러 작업이 하나의 묶음으로 처리되는 것 .
특징
원자성 : 트랜잭션 내의 모든 작업은 모두 성공하거나 모두 실패해야함
일관성 : 트랜잭션이 완료되면 데이터 베이스가 일관된 상태를 유지해야함
격리성 : 동시에 실행되는 트랜잭션은 서로 간섭하지 않아야함
지속성 : 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 반영되어야함
@Transactional 어노테이션이란 ?
특정 메서드나 클래스가 트랜잭션 내에서 실행되도록 지정할 수 있음.
기본 사용법
메서드에 적용
import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class MyService { @Transactional public void performTransactionalOperation() { // 트랜잭션이 시작. // 데이터베이스 작업수행. // 메소드가 성공적으로 완료되면 트랜잭션이 커밋. // 예외가 발생하면 트랜잭션이 롤백. } }
클래스에 적용
import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional public class MyService { public void method1() { // 트랜잭션 내에서 실행. } public void method2() { // 트랜잭션 내에서 실행. } }
주요속성
propagation
트랜잭션의 전파 행동을 정의.
현재 트랜잭션이 존재할때 새로운 트랜잭션을 시작할지 여부 결정.
'REQUIRED' (기본값) : 현재 트랜잭션이 존재하면 그 트랜잭션 내에서 실행하고, 존재하지 않으면 새로운 트랜잭션을 시작
'REQUIREDS_NEW' : 항상 새로운 트랜잭션을 시작
'MANDATORY' : 현재 트랜잭션이 존재해야 하며, 존재하지 않으면 예외발생
@Transactional(propagation = Propagation.REQUIRES_NEW) public void method() { // 새로운 트랜잭션에서 실행됩니다. }
isolation
트랜잭션의 격리 수준을 정의.
다른 트랜잭션이 동시에 실행될 때 서로 간섭하지 않도록 설정할 수 있음.
'READ_UNCOMMITTED' : 다른 트랜잭션에서 커밋되지 않은 변경사항을 읽을 수 있음.
'READ_COMMITTED' (기본값) : 다른 트랜잭션에서 커밋된 변경사항만 읽을 수 있음.
'REPEATABLE_READ' : 트랜잭션 내에서 읽은 데이터가 변경되지 않음을 보장.
'SERIALIZABLE' : 가장 높은 격리 수준으로 , 트랜잭션이 직렬화된 것 처럼 실행.
@Transactional(isolation = Isolation.SERIALIZABLE) public void method() { // 높은 격리 수준에서 실행됩니다. }
timeout
읽기 전용임을 명시.
읽기 전용 트랜잭션은 성능 최적화를 할 수 있음.
@Transactional(readOnly = true) public void method() { // 읽기 전용 트랜잭션으로 실행됩니다. }
rollbackFor
특정 예외가 발생했을 때 트랜잭션을 롤백하도록 설정 .
@Transactional(rollbackFor = Exception.class) public void method() { // Exception 발생 시 트랜잭션이 롤백됩니다. }
noRollbackFor
특정 예외가 발생해도 트랜잭션을 롤백하지 않도록 설정.
@Transactional(noRollbackFor = IllegalArgumentException.class) public void method() { // IllegalArgumentException 발생 시 트랜잭션이 롤백되지 않습니다. }
'[Spring]' 카테고리의 다른 글
[Spring] Task 실행과 스케쥴링 (0) 2024.08.15 [Spring] JPA , JDBC, Hibernate, Spring data JPA 차이 (0) 2024.07.02 [Spring] @Component , @Configuration (0) 2024.06.26 [Spring] Spring Boot로 JDBC Template 기반 애플리케이션 만들기 (0) 2024.05.15 [Spring] Spring Boot의 핵심 개념과 사용 예제 (0) 2024.05.14