繁体   English   中英

Spring @Transactional 在 ApplicationServer 中不起作用

[英]Spring @Transactional not working in ApplicationServer

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

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

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

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

知道这里有什么问题吗?

编辑

我刚刚尝试从我的代码中显式调用JtaTransactionmanager上的 setRollbackOnly。 事务仍将提交。 这种看起来像 Spring 引导给我的错误。

编辑 2

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM