【问题标题】:Spring @Transactional not working in ApplicationServerSpring @Transactional 在 ApplicationServer 中不起作用
【发布时间】:2019-11-18 15:26:21
【问题描述】:

我们有一个暴露一些 REST 端点的 Spring-Boot 应用程序。我们允许此应用程序独立运行(作为可执行 jar)或作为部署在 wildfly-11 应用程序服务器中的战争。

定义 REST 端点的类标记为 @RestController @Transactional(REQUIRES_NEW)(显然都是在类级别上)。独立运行时,一切都按预期运行,但在 Wildfly 中部署时,异常回滚不起作用。我们通过在完全相同的数据库上操作时发送完全相同的 REST 消息来确定这一点。

我们已经通过调试确认堆栈跟踪的最终帧在这两种情况下都是相同的,尤其是在这两种情况下,我们都在 REST-controller bean 周围看到了一个事务代理。

一个区别是,在wildfly中,应用程序将使用由wildfly准备的jndi-datasource,而独立时spring-boot将管理数据库连接。

知道这里有什么问题吗?

编辑

我刚刚尝试在我的代码中对 JtaTransactionmanager 显式调用 setRollbackOnly。事务仍将提交。对我来说,这种看起来像是 Spring Boot 中的错误。

编辑 2

调试进一步显示事务似乎设置为自动提交 - 每个语句都立即写入数据库。这似乎违反了注解 @Transactional 以及 Spring 在我的 bean 周围创建事务代理这一事实。

【问题讨论】:

    标签: java database spring-boot spring-transactions


    【解决方案1】:

    这不是一个完整的答案 - 只是一个推理。 JNDI 通常用于应用服务器层,而JDBC - 用于应用层。在应用服务器层使用覆盖应用设置的全局事务设置。关注spring doc获取更多信息

    【讨论】:

    • 我认为这是根本原因。然而,Spring 确实做出了承诺,它的声明式事务配置与 jta 一样独立工作。因此,如果同一个工件在独立或 AS 上的行为不同,则必须在此处打破某些东西。
    • 好吧,我同意。一旦我遇到了WF,那是一个很大的痛苦(所以,我希望你能解决这个问题。如果是这样,请告知int topic。祝你好运!)
    【解决方案2】:

    由于我无法理解的原因,将 spring-boot webapp 部署到应用程序服务器时的默认事务行为是 auto-commit

    解决此问题的方法是使用属性spring.datasource.tomcat.default-auto-commit=false 来丰富您的应用程序配置

    【讨论】:

      猜你喜欢
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 2019-10-21
      相关资源
      最近更新 更多