В JOOQ, если я напрямую использую базовое соединение, сохраняется ли мой транзакционный статус?

2

Предположим, у меня есть объект JOOQ DSLContext, и мне нужно опуститься до уровня объекта JDBC Connection для выполнения некоторой логики, отличной от JOOQ. (В моем случае я хочу использовать объект CopyManager драйвера Postgres).

Если мой DSLContext является транзакционным, будут ли операции, выполняемые непосредственно в Connection, обернуты одной транзакцией? Я использую поставщик транзакций по умолчанию JOOQ.

например (код Котлина, но должен быть довольно прозрачным для пользователей Java)

dsl.transaction { transactionConfig ->
    val transactionalDSL = DSL.using(transactionConfig)
    transactionalDSL.connection { connection ->
        val manager = CopyManager(connection as BaseConnection)
        manager.copyInto(table, inputStream, fields)
    }
}
Теги:
kotlin
transactions
jooq

2 ответа

2
Лучший ответ

Правильное использование вашего API.

Оптимальное использование API

При использовании DSLContext.transaction(TransactionalRunnable) важно использовать конфигурацию аргументов, которую вы называете transactionConfig для всех взаимодействий с базами данных на границе транзакции (а не внешняя ссылка dsl, которая остается немодифицированной и может возвращать новое соединение из пула соединений).

Другими словами, transactionConfig - это Configuration которая гарантирует, что всегда будет возвращать одно и то же Connection JDBC из области транзакции, независимо от вашей конфигурации DataSource/ConnectionProvider.

Работа с транзакциями, связанными с потоками

Вышесказанное является гарантией jOOQ, но, конечно же, вы можете гарантировать транзакции, связанные с потоками, также на более низком уровне, например:

  • Используя jOOQ ThreadLocalTransactionProvider вместе с DSLContext.transaction(ContextTransactionRunnable), в случае, если ваша логика будет выглядеть так:

    dsl.transaction { () ->
        dsl.connection { connection ->
            val manager = CopyManager(connection as BaseConnection)
            manager.copyInto(table, inputStream, fields)
        }
    }
    
  • Путем использования связанного с потоком пула транзакций или DataSource. В этом случае ваша dsl.configuration().connectionProvider() должна вернуть такое же соединение, как transactionConfig.connectionProvider(), и это будет прозрачно для jOOQ.

0

Экспериментально, ответ кажется да.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню