스프링/6. 스프링 DB-2

41. 스프링 트랜잭션 우선순위

sdafdq 2023. 10. 14. 20:28

이게 보니까 우리가 스프링 트랜잭션 한번 배웠긴 했는데 다시 배우는 게

이번에는 좀 더 깊게? 어떻게 일어나는 지 그거 보는거랑 트랜잭션 추가 기능? 트랜잭션에 우리가

@Transactional(옵션이름=값)

이런 식으로 줄 수 있는데,

 

우선순위라는 게 예를 들어

 

@Transactional(옵션1 = 값1)

class TxClass{
	@Transactional(옵션1 = 값2)
	public void txTest(){
    	
    }

}

하면 저 값2가 적용된다는 이야기.

사실 더 자세할 수록 그것이 적용된다는 것은 어느정도 프로그래머 입장에서는 통설로 받아들여져서..

 

 

 

@SpringBootTest
@Slf4j
public class TxLevelTest {
    @Autowired
    LevelService service;

    @Test
    void doTest(){
        service.write();
        service.read();
    }

    @TestConfiguration
    static class TestConfig{
        @Bean
        public LevelService levelService(){
            return new LevelService();
        }
    }

    @Slf4j
    @Transactional(readOnly = true)
    static class LevelService{
        @Transactional(readOnly = false)
        public void write(){
            log.info("call write");
            printTxInfo();
        }

        public void read(){
            log.info("call read");
            printTxInfo();
        }

        private void printTxInfo(){
            boolean isTxActive =  TransactionSynchronizationManager.isActualTransactionActive();
            log.info("tx active = {}", isTxActive);
            boolean isTxReadonly = TransactionSynchronizationManager.isCurrentTransactionReadOnly();
            log.info("tx readOnly = {}", isTxReadonly);
        }
    }
}

테스트 문.

일단 

@TestConfiguration

저거 해야 저게 Configuration으로 인지된다.

@Bean해서 빈으로 등록할 거 해 주고.

 

그럼 빈으로 등록되니 @Autowired 해서 자동으로 주입받을 수 있음.

 

뭐 당연히 더 자세한 옵션이 우선적으로 적용 됨.

 

그것보다는 

TransactionSynchronizationManager

이게 트랜잭션 상태에 대한 여러 정보를 얻을 수 있는 클래스 인 듯.

저렇게 트랜잭션 활성화 상태인지, 또 트랜잭션이 현재 readOnly 상태인지.

저런 트랜잭션 옵션에 대해선 나중에 다룰 듯.

 

일단 만난 김에 readOnly에 대해 말하자면

말 그대로 읽기전용, 뭐 select나 이런 거만 된다는 뜻 인듯?

그리고 기본값은 당연 false.

 

그리고 인터페이스에도 트랜잭션 적용이 가능하다고 함.

물론 잘 사용은 안할 듯.

확실히 구현체에 넣어놓는게 직관적임. 사용해야 할지 아닐 지도 더 잘 알 수 있고.

스프링에서도 권장하지 않는 방법이라고 함.

뭐 인터페이스에 애노테이션 하는 자체가 AOP 적용이 잘 안될 때가 있다고 함.

AOP란 관점지향 객체 프로그램 으로,

메소드를 관점에 따라 나눈? 공통적인 관점에 따라 처리하는? 프록시, 왜 @Before @After같이 이것들은 처음엔 이렇게 해야 해 이런 거.