【问题标题】:Cannot use ContextTransactionalCallable with TransactionProvider不能将 ContextTransactionalCallable 与 TransactionProvider 一起使用
【发布时间】:2019-02-20 12:36:12
【问题描述】:

我有一个错误,我无法解决。

我正在使用 Spring 和 JOOQ。

这里发生错误:

   @Transactional
    public UUID create(List<User> users) {
        UUID uuid = UUID.randomUUID();
        dslContext.transaction(() -> {
            dslContext
                    .insertInto(APPLE, APPLE.APPLE_ID, APPLE.TITLE)
                    .values(uuid, uuid.toString())
                    .execute();

            users.forEach(user -> {
                dslContext
                        .insertInto(APPLE_MEMBERS, APPLE_MEMBERS.APPLE_ID, APPLE_MEMBERS.USER_ID)
                        .values(uuid, user.getUserId())
                        .execute();
            });

        });

        return uuid;
    }

错误:

org.jooq.exception.ConfigurationException: Cannot use ContextTransactionalCallable with TransactionProvider of type class org.springframework.boot.autoconfigure.jooq.SpringTransactionProvider

也许有人有同样的错误或知道如何解决这个错误?

【问题讨论】:

    标签: spring-boot jooq


    【解决方案1】:

    使用开箱即用的功能:

    您必须选择以下两种方法之一:

    • Spring 通过注解的声明式事务管理
    • jOOQ 通过其 API 进行程序化事务管理

    开箱即用,它们无法组合。在您的特定情况下,我不明白您为什么要这样做。嵌套的程序化事务与外部的声明性事务具有完全相同的范围。这是多余的。

    使用自定义 TransactionProvider 实现

    您可以编写自己的TransactionProvider,它能够与Spring 的事务管理进行通信,并允许在@Transactional 注释方法中嵌入嵌套事务,但我通常不建议这样做。从这两种方法中选择一种。

    【讨论】:

    • 仅供参考,大约一年后,我再次碰到了这个,不记得为什么我们在 jOOQ 代码中有这个奇怪的手动 Spring Tx 代码......原来有些方法以非事务性的,然后切换到事务性的循环分块插入(通过调用本地私有方法)。这对@Transactional 来说很烦人,因为by default it's only supported on public methods。我会评论我们的代码。使用 jOOQ 事务会很不错,但我明白为什么很难。
    • 除其他外,jOOQ 会自动关闭自动提交,然后再次打开。我讨厌做所有这些管道。终于把一切都整理好了。有时它需要比我们希望的更多的参与。
    • ...当然,Spring 也是如此。或者应该。在一些相当特殊的情况下它不会。我会在某处提交错误。
    • Eh :-) 我会去找报告的。或者不是,如果是春天:)
    • 正如@LukasEder 指出的那样,您必须选择两种选择之一。但是,如果您必须在代码中使用编程事务,您可以使用 spring 的接口而不是 jooq 的接口进行事务管理。只需将 TransactionTemplate 注入您的实现(它在 spring-boot 应用程序中自动配置)
    猜你喜欢
    • 1970-01-01
    • 2014-06-20
    • 2020-03-06
    • 2019-09-01
    • 2017-04-15
    • 2019-07-09
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多