[英]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.