Предположим, у меня есть объект 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)
}
}
Правильное использование вашего 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.
Экспериментально, ответ кажется да.