【发布时间】: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