[코틀린/스프링] 트랜잭션 관리

트랜잭션 관리

선언적 트랜잭션 관리

프로그래밍 방식 트랜잭션 관리

코루틴과 선언적 트랜잭션 관리

리액티브 프로그래밍 환경에서 트랜잭션 관리

트랜잭션 작업을 수행하는 함수에 선언적 트랜잭션 관리를 적용할 경우 다음과 같이 함수의 종류, 데이터베이스 라이브러리 종류에 따라 다음과 같이 동작 차이가 발생하게 된다. 리액티브 타입을 사용하지 않고 코루틴 확장 라이브러리를 사용한다고 가정한다.

  • 선언적 트랜잭션 관리 + 일반 함수 + 블로킹 JDBC 라이브러리
    • 장점: 선언적 트랜잭션 관리가 동작한다.
    • 단점: 블로킹 IO 작업이 스레드를 블로킹한다. 함수 내에서 트랜잭션을 유지하면서 블로킹 IO 작업이 스레드를 블로킹하지 않도록 만들 수 없다. 코루틴을 새로 생성할 수는 있지만 함수를 실행하는 스레드와 코루틴을 실행하는 스레드는 동일한 스레드가 아니므로 트랜잭션이 전파되지 않는다.
  • 선언적 트랜잭션 관리 + 일반 함수 + 논블로킹 R2DBC 라이브러리
    • 장점: 선언적 트랜잭션 관리가 동작한다.
    • 단점: R2DBC 라이브러리를 통한 IO 작업을 일반 함수에서 실행하기 위해 스레드를 블로킹해야 한다. 일반 함수 내에서 코루틴을 실행하려면 새로운 코루틴 생성이 필요하다.
  • 선언적 트랜잭션 관리 + suspend 함수 + 블로킹 JDBC 라이브러리
    • 장점: 함수 내에서 블로킹 IO 작업을 코루틴을 사용하여 처리함으로써 IO 작업이 현재 스레드를 블로킹하지 않도록 만들 수 있다. 함수 내에서 코루틴을 실행하기 위해 새로운 코루틴 생성이 필요하지 않다.
    • 단점: 선언적 트랜잭션 관리가 동작하지 않는다. 프로그래밍 방식으로 트랜잭션 관리할 경우 블로킹 IO 작업을 코루틴을 사용하여 처리할 수 없다.
  • 선언적 트랜잭션 관리 + suspend 함수 + 논블로킹 R2DBC 라이브러리
    • 장점: 선언적 트랜잭션 관리가 동작한다. IO 작업은 현재 스레드를 블로킹하지 않는다. 함수 내에서 코루틴을 실행하기 위해 새로운 코루틴 생성이 필요하지 않다.


결론적으로 JDBC 블로킹 라이브러리를 사용하는 경우 트랜잭션 관리를 수행하려면 스레드를 블로킹할 수 밖에 없다. 트랜잭션 관리가 필요하지 않다면 코루틴을 사용하여 블로킹 호출을 별도의 스레드에서 수행하도록 하여 스레드 블로킹을 막을 수 있다.

JDBC 블로킹 라이브러리를 사용 시 트랜잭션을 관리하기 위해서는 트랜잭션 정보를 현재 스레드에 저장하는 과정이 필요한데, 트랜잭션 내 작업 실행 도중 스레드가 변경되면 트랜잭션 정보가 유지되지 않는다.

참고

  • <>

Comments