diff --git a/spring-transaction/src/test/java/com/example/springtransaction/propagation/BasicTxTest.java b/spring-transaction/src/test/java/com/example/springtransaction/propagation/BasicTxTest.java index cebe5585..e48d47cc 100644 --- a/spring-transaction/src/test/java/com/example/springtransaction/propagation/BasicTxTest.java +++ b/spring-transaction/src/test/java/com/example/springtransaction/propagation/BasicTxTest.java @@ -9,8 +9,10 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.UnexpectedRollbackException; +import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.DefaultTransactionDefinition; import javax.sql.DataSource; @@ -133,4 +135,23 @@ public class BasicTxTest { assertThatThrownBy(() -> txManager.commit(outer)) .isInstanceOf(UnexpectedRollbackException.class); } + + @Test + void inner_rollback_requires_new() { + log.info("외부 트랜잭션 시작"); + TransactionStatus outer = txManager.getTransaction(new DefaultTransactionDefinition()); + log.info("outer.isNewTransaction()={}", outer.isNewTransaction()); // true + + log.info("내부 트랜잭션 시작"); + DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); + definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 신규 트랜잭션 + TransactionStatus inner = txManager.getTransaction(definition); + log.info("inner.isNewTransaction()={}", inner.isNewTransaction()); // true + + log.info("내부 트랜잭션 롤백"); + txManager.rollback(inner); + + log.info("외부 트랜잭션 커밋"); + txManager.commit(outer); + } }