[JPA]Transactional Propagation

박우민·2020년 6월 2일
1

Propagation는 전파란 의미

JPA에서 Propagation는

@Transactional keyword를 가진 메소드이 중첩으로 호출되었을 때, 어떻게 동작 시킬 것인지에 대한 결정이다.
Transaction의 중첩을 허용할 것이냐, 기존 Transaction을 사용할 것이냐, 기존 Transaction을 중단하고 새로운 Transaction을 적용할 것인지 등을 결정할 수 있음

종류는....음 ...........................................................

여럿있는데 기억이 잘 안납니다. 슬쩍 보고와서 적어보면,

REQUIRED, SUPPORTS, MANDATORY, REQUIRES_NEW, NOT_SUPPORTED, NEVER, NESTED가 존재합니다.

차례로 설명해보도록 하죠.

REQUIRED는
기존에 트랜잭션이 있으면 유효성을 판단하여 문제가 있으면 Exception을 던지고 문제가 없으면 그것을 이용합니다.
만약 기존에 트랜잭션이 없으면 새로운 트랜잭션을 생성합니다.

SUPPORTS는
기존에 트랜잭션이 있으면 유효성을 판단하여 문제가 있으면 Exception을 던지고 문제가 없으면 그것을 이용합니다.
만약 트랜잭션이 없다면 트랜잭션을 생성하지 않습니다.

MANDATORY는
기존에 트랜잭션이 있으면 유효성을 판단하여 문제가 있으면 Exception을 던지고 문제가 없으면 그것을 이용합니다.
만약 트랜잭션이 없다면 Exception을 던집니다.

NEVER는
기존에 트랜잭션이 있으면 Exception을 던집니다.
만약 트랜잭션이 없다면 트랜잭션을 생성하지 않습니다.

사용할 일이 있으련지? 모르겠네요

NOT_SUPPORTED는
기존에 트랜잭션이 있으면 중단하고, 트랜잭션을 생성하지 않은 상태에서 비지니스 로직을 수행합니다.

REQUIRES_NEW 기존에 트랜잭션이 있으면 그것을 중단하고, 그리고 새로운 것을 그냥 생성합니다.

NESTED

For NESTED propagation, Spring checks if a transaction exists, then if yes, it marks a savepoint. This means if our business logic execution throws an exception, then transaction rollbacks to this savepoint. If there's no active transaction, it works like REQUIRED.

이렇게 이야기하는데, 트랜잭션이 존재할 때, savepoint를 지정하고, 이후 비지니스 로직을 수행할 때 exception이나면 savepoint로 롤백한다는데, 트랜잭션을 그대로 사용하나 savepoint를 지정하여 스냅샷 처럼 과거 시점으로 돌아간다는건지..... 새로운 트랜잭션을 생성해서 savepoint 이후의 트랜잭션을 무효화 시킨다는건지.... 일단 기본적으로 RDBMS에서는 nested transaction이 막혀있으니까......................................음.............. 설명해주실분?

DataSourceTransactionManager supports this propagation out-of-the-box. Also, some implementations of JTATransactionManager may support this.

JpaTransactionManager supports NESTED only for JDBC connections. However, if we set nestedTransactionAllowed flag to true, it also works for JDBC access code in JPA transactions if our JDBC driver supports savepoints.

profile
안녕하세요 Software Development Engineer 입니다.

0개의 댓글