gpt4 book ai didi

java - 在 JOOQ 中,如果我直接使用底层连接,我的事务状态是否保持?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:33:31 25 4
gpt4 key购买 nike

假设我有一个 JOOQ DSLContext 对象,我需要下降到 JDBC Connection 对象的级别来执行一些非 JOOQ 逻辑。 (在我的例子中,我想使用 Postgres 驱动程序的 CopyManager 对象)。

如果我的 DSLContext 是事务性的,直接在 Connection 上执行的操作是否会被同一个事务包装?我正在使用 JOOQ 的默认交易提供商。

例如(Kotlin 代码,但对 Java 用户应该非常透明)

dsl.transaction { transactionConfig ->
val transactionalDSL = DSL.using(transactionConfig)
transactionalDSL.connection { connection ->
val manager = CopyManager(connection as BaseConnection)
manager.copyInto(table, inputStream, fields)
}
}

最佳答案

您的 API 使用是正确的。

最佳 API 使用

使用时的重要事项 DSLContext.transaction(TransactionalRunnable) 是使用参数配置,你称之为transactionConfig对于事务边界内的所有数据库交互(不是外部 dsl 引用,它保持不变并且可能从连接池返回一个新连接)。

换句话说,transactionConfigConfiguration保证始终返回完全相同的 JDBC Connection从交易的范围,不管你的DataSource/ConnectionProvider配置。

使用线程绑定(bind)事务

以上是 jOOQ 的保证,当然你也可以在较低级别上保证线程绑定(bind)事务,例如:

  • 通过使用 jOOQ ThreadLocalTransactionProvider连同 DSLContext.transaction(ContextTransactionRunnable) ,在这种情况下,您的逻辑将如下所示:

    dsl.transaction { () ->
    dsl.connection { connection ->
    val manager = CopyManager(connection as BaseConnection)
    manager.copyInto(table, inputStream, fields)
    }
    }
  • 通过使用线程绑定(bind)、事务连接池或数据源。在这种情况下,您的 dsl.configuration().connectionProvider()应返回与 transactionConfig.connectionProvider() 相同的连接,这对 jOOQ 来说是透明的。

关于java - 在 JOOQ 中,如果我直接使用底层连接,我的事务状态是否保持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48541633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com