[Spring] @Transactional

LeHoODU·2023년 11월 7일
0
post-thumbnail

1.Transaction이란?

데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다. 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다.

2.Transaction의 성질(=ACID)

원자성(Atomicity)은 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력이다. 또한 중간 단계까지 실행되고 실패하는 일이 없도록 하는 것이다.

일관성(Consistency)은 트랜잭션 처리 전과 처리 후 데이터 모순이 없는 상태를 유지하는 것을 의미한다.

•독립성(Isolation)트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다. 이

•지속성(Durability)성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의미한다.

3.Spring Transaction

비즈니스 로직과 트랜잭션 처리 로직이 함께 있다면, 코드의 중복이 생길 수 있기에 스프링에서는 두가지 트랜잭션 기술을 사용할 수 있다.

1.프로그래밍적 트랜잭션
TransactionTemplate

Spring에서는 데이터 접근 기술(Jdbc, JPA)에 따라 트랜잭션을 고려해 추상화를 지원한다. 이때 PlatformTransactionManager 인터페이스를 이용한다.

2. 선언적 트랜잭션
@Transaction

@Transactional 어노테이션을 지원해준다. 필요한 클래스 혹은 메서드에 @Transactional 어노테이션을 달아 이용하면 된다.

4.@Transactional 옵션

1.Isolation
트랜잭션 간의 데이터 격리 수준을 설정

@Transactional(isolation=Isolation.DEFAULT)

💥Dirty Read : 동시에 진행되고 있는 다른 트랜잭션에서 변경한 데이터를 현재 진행 중인 트랜잭션에서 읽어 들이는 현상

💥Phantom Read : 다른 트랜젹션에서 수행한 작업에 의해 레코드가 안보였다 보였다 하는 현상

💥Non-repeatable Read : 트랜잭션 조회 과정 중 다른 트랜잭션에 의해 수정된 데이터가 조회(일관된 데이터 조회 불가)

•READ_UNCOMMITED
=>커밋되지 않은 데이터에 대한 조회 가능.
[Dirty Read 발생]

•READ_COMMITED
=>커밋된 데이터만 조회 가능.
[Dirty Read 방지, But Phantom Read, Non-Repeatable Read 발생]

•REPEATABLE READ
=>모든 트랜잭션이 수행 될때까지 데이터 수정 불가. 일관된 데이터 조회 가능.

•SERIALIZABLE
=> 모든 트랜잭션이 순차적으로 실행 되어야 한다. 가장 안전하지만 가장 성능이 떨어짐.
[Phantom Read 방지]

2.Propagation
트랜잭션 수행 중 다른 트랙잭션 호출 시 어떻게 수행 할지 지정

@Transactional(propagation=Propagation.REQUIRED)

•REQUIRED (DEFAULT)
이미 진행중인 트랜잭션이 있다면 해당 트랜잭션을 따르고, 진행중이 아니라면 새로운 트랜잭션을 생성

•REQUIRES_NEW
항상 새로운 트랜잭션을 생성한다. 이미 진행중인 트랜잭션이 있다면 중지하고 해당 트랜잭션 작업을 먼저 진행

•SUPPORT
이미 진행 중인 트랜잭션이 있다면 해당 트랜잭션 속성을 따르고, 없다면 트랜잭션을 필요로 하지 않음

•NOT_SUPPORT
이미 진행중인 트랜잭션이 있다면 중지하고, 트랜잭션 없이 작업을 수행한다. 메서드 종료 후 다시 시작.

•MANDATORY
진행중인 트랜잭션이 있어야만, 작업을 수행. 없다면 Exception을 발생

•NEVER
트랜잭션이 진행중이지 않을 때 작업을 수행. 진행중인 트랜잭션이 있다면 Exception을 발생시킨다.

•NESTED
진행중인 트랜잭션이 있다면 중첩된 트랜잭션이 실행

3.noRollbackFor
특정 예외 발생 시 롤백 하지 않는다

@Transactional(noRollbackFor=Exception.class)

4.rollbackFor
특정 예외 발생 시 롤백한다

@Transactional(rollbackFor=Exception.class)

5.timeOut
임의로 정한 시간 내에 수행 실패시 롤백한다

@Transactional(timeout=10)
//timeout 이 -1 일 경우 no timeout

6.readOnly
읽기 전용으로 설정, true 시 insert, update, delete 실행 시 예외 발생

@Transactional(readonly = true)

참고
https://velog.io/@kdhyo/JavaTransactional-Annotation-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-26her30h#3-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EC%B2%98%EB%A6%AC-%EB%B0%A9%EB%B2%95
https://steady-hello.tistory.com/121

profile
Back-End Developer

0개의 댓글