Micronaut+JOQ를 통한 트랜잭션 관리

11691 단어 MicronautjOOQtech
  • Micronaut: 2.3.1
  • jOOQ: 3.14.7
  • Kotlin: 1.4.21
  • 사용할 테이블

    customer 책상->customerdetail 테이블 순서로 INSERT 처리 시험

    트랜잭션 관리 없음


    customer_detail 테이블의 INSERT가 실패한 경우, 먼저 INSERT의customer 테이블이 뒤집히지 않습니다.
    @Singleton
    class CustomersService(
        private val dslContext: DSLContext
    ) {
    
        fun add(name: String) {
            val id = Random.nextInt()
            dslContext
                .insertInto(CUSTOMER, CUSTOMER.ID, CUSTOMER.CREATED_AT)
                .values(id, LocalDateTime.now())
                .execute()
    
            dslContext
                .insertInto(CUSTOMER_DETAIL, CUSTOMER_DETAIL.CUSTOMER_ID, CUSTOMER_DETAIL.NAME, CUSTOMER_DETAIL.CREATED_AT)
                .values(id, name, LocalDateTime.now())
                .execute()
        }
    }
    

    DSLcontex#transation 사용


    우리는 기대에 따라 거래 관리를 진행한다.
    @Singleton
    class CustomerService(
        private val dslContext: DSLContext
    ) {
        fun add(name: String) {
            dslContext.transaction { c ->
                val id = Random.nextInt()
                DSL.using(c)
                    .insertInto(CUSTOMER, CUSTOMER.ID, CUSTOMER.CREATED_AT)
                    .values(id, LocalDateTime.now())
                    .execute()
    
                DSL.using(c)
                    .insertInto(
                        CUSTOMER_DETAIL,
                        CUSTOMER_DETAIL.CUSTOMER_ID,
                        CUSTOMER_DETAIL.NAME,
                        CUSTOMER_DETAIL.CREATED_AT
                    )
                    .values(id, name, LocalDateTime.now())
                    .execute()
            }
        }
    }
    
    https://www.jooq.org/doc/3.1/manual/sql-execution/transaction-management/

    @TransactionalAdvice 사용


    트랜잭션 관리 기능은 Transactional Advice 를 통해 제공됩니다.
    Spring의 Transactional과 비슷하게 생각하면 OK.
    Gradle 사용 시 dependencies에 다음과 같은 내용을 추가합니다.
    4
    dependencies {
        ...
        implementation 'io.micronaut.data:micronaut-data-tx'
    }
    
    Transactional Advice를 사용하면 클라스와 방법을 오픈으로 설정해야 합니다.
    읽기 전용 ReadOnly 초대장도 마련됐다.
    @Singleton
    open class CustomersService(
        private val dslContext: DSLContext
    ) {
    
        @TransactionalAdvice
        open fun add(name: String) {
            val id = Random.nextInt()
            dslContext
                .insertInto(CUSTOMER, CUSTOMER.ID, CUSTOMER.CREATED_AT)
                .values(id, LocalDateTime.now())
                .execute()
    
            dslContext
                .insertInto(CUSTOMER_DETAIL, CUSTOMER_DETAIL.CUSTOMER_ID, CUSTOMER_DETAIL.NAME, CUSTOMER_DETAIL.CREATED_AT)
                .values(id, name, LocalDateTime.now())
                .execute()
        }
    }
    
    Transactional Advice 외전이 공식 Doc에 등장하지 않았기 때문에 주의해서 사용하세요.

    좋은 웹페이지 즐겨찾기