Spring @Transactional 在 ApplicationServer 中不工作
Spring @Transactional not working in ApplicationServer
我们有一个 Spring-Boot 应用程序公开了一些 REST 端点。我们允许此应用程序独立运行(作为可执行 jar)或作为 war 部署在 wildfly-11 应用程序服务器中。
定义 REST 端点的 class 标记为 @RestController @Transactional(REQUIRES_NEW)
(显然都在 class 级别)。 运行 独立时,一切都按预期工作,但在 wildfly 中部署时,异常回滚不起作用。我们通过在完全相同的数据库上运行时发送完全相同的 REST 消息来建立这一点。
我们已经通过调试确认堆栈跟踪的最终帧在这两种情况下都是相同的,尤其是在这两种情况下我们都看到了围绕我们的 REST 控制器 bean 的事务代理。
一个区别是,在 wildfly 中,应用程序将使用由 wildfly 准备的 jndi-datasource,而独立的 spring-boot 将管理数据库连接。
知道这里出了什么问题吗?
编辑
我刚刚尝试在我的代码中对 JtaTransactionmanager
显式调用 setRollbackOnly。事务仍将提交。对我来说,这种看起来像是 Spring Boot 中的错误。
编辑 2
调试进一步显示事务似乎设置为自动提交 - 每条语句都会立即写入数据库。这似乎违反了注释 @Transactional
以及 Spring 在我的 bean 周围创建事务代理的事实。
这不是一个完整的答案 - 只是一个推理。 JNDI
通常用于应用服务器层,而 JDBC
- 在应用层。在应用程序服务器层使用覆盖应用程序设置的全局事务设置。关注spring doc获取更多
由于超出我理解的原因,在将 spring-boot webapp 部署到应用程序服务器时,默认 事务行为是 auto-commit
。
解决此问题的方法是使用 属性 spring.datasource.tomcat.default-auto-commit=false
丰富您的应用程序配置
我们有一个 Spring-Boot 应用程序公开了一些 REST 端点。我们允许此应用程序独立运行(作为可执行 jar)或作为 war 部署在 wildfly-11 应用程序服务器中。
定义 REST 端点的 class 标记为 @RestController @Transactional(REQUIRES_NEW)
(显然都在 class 级别)。 运行 独立时,一切都按预期工作,但在 wildfly 中部署时,异常回滚不起作用。我们通过在完全相同的数据库上运行时发送完全相同的 REST 消息来建立这一点。
我们已经通过调试确认堆栈跟踪的最终帧在这两种情况下都是相同的,尤其是在这两种情况下我们都看到了围绕我们的 REST 控制器 bean 的事务代理。
一个区别是,在 wildfly 中,应用程序将使用由 wildfly 准备的 jndi-datasource,而独立的 spring-boot 将管理数据库连接。
知道这里出了什么问题吗?
编辑
我刚刚尝试在我的代码中对 JtaTransactionmanager
显式调用 setRollbackOnly。事务仍将提交。对我来说,这种看起来像是 Spring Boot 中的错误。
编辑 2
调试进一步显示事务似乎设置为自动提交 - 每条语句都会立即写入数据库。这似乎违反了注释 @Transactional
以及 Spring 在我的 bean 周围创建事务代理的事实。
这不是一个完整的答案 - 只是一个推理。 JNDI
通常用于应用服务器层,而 JDBC
- 在应用层。在应用程序服务器层使用覆盖应用程序设置的全局事务设置。关注spring doc获取更多
由于超出我理解的原因,在将 spring-boot webapp 部署到应用程序服务器时,默认 事务行为是 auto-commit
。
解决此问题的方法是使用 属性 spring.datasource.tomcat.default-auto-commit=false