如何解决Spring Boot / Atomikos / SQL Server 错误
我将 Spring Boot 应用打包为部署到 Wildfly 的 war 文件。有 XA 和非 XA 数据源和 JMS(Wildfly 内部 ActiveMQ)。它在 sql Server 或 Oracle 中部署和运行良好(在 Wildfly 独立 xml 中配置并通过 JNDI 获取)。
现在我们正在尝试抽象应用服务器依赖项(事务、数据源和 jms)。我有一个外部 ActiveMQ 服务器正在运行。我使用 Atomikos(5.0.7) 配置了 jms、数据源和事务管理。当我将此配置部署到 Wildfly(仅用于测试)时,它可以与 oracle 一起使用文件。但是,将 sql Server 作为后端时出现错误。
2021-02-03 09:37:09,235 DEBUG [com.atomikos.icatch.imp.CompositeTransactionManagerImp] (default task-1) suspend() for transaction TM1
2021-02-03 09:37:09,236 TRACE [com.atomikos.icatch.imp.CoordinatorImp] (default task-1) Coordinator TM1 entering state: ABORTING
2021-02-03 09:37:09,236 DEBUG [com.atomikos.datasource.xa.XAResourceTransaction] (default task-1) XAResource.end ( XID: 636F72657375697465544D313631323336323839363134323031373931:636F72657375697465544D3731,XAResource.TMSUCCESS ) on resource springbatch.repositoryDataSource represented by XAResource instance XAResourceID:1
2021-02-03 09:37:09,237 DEBUG [com.atomikos.datasource.xa.XAResourceTransaction] (default task-1) XAResource.rollback ( XID: 636F72657375697465544D313631323336323839363134323031373931:636F72657375697465544D3731 ) on resource dataSourceOne represented by XAResource instance XAResourceID:1
2021-02-03 09:37:09,241 WARN [com.atomikos.datasource.xa.XAResourceTransaction] (default task-1) XA resource 'springbatch.repositoryDataSource': rollback for XID 'XID: 636F72657375697465544D313631323336323839363134323031373931:636F72657375697465544D3731' raised -4: the supplied XID is invalid for this XA resource: javax.transaction.xa.XAException: The function ROLLBACK: Failed. The status is: -4. Error: "*** sql_XA DTC_ERROR Context: xa_rollback_entry,StatusCode=-4 (0xFFFFFFFC)"
at deployment.coresuite-war-CSWC-SNAPSHOT.war//com.microsoft.sqlserver.jdbc.sqlServerXAResource.DTC_XA_Interface(sqlServerXAResource.java:653)
at deployment.coresuite-war-CSWC-SNAPSHOT.war//com.microsoft.sqlserver.jdbc.sqlServerXAResource.rollback(sqlServerXAResource.java:803)
at deployment.coresuite-war-CSWC-SNAPSHOT.war//com.atomikos.datasource.xa.XAResourceTransaction.rollback(XAResourceTransaction.java:382)
我的数据源配置是
public DataSource dataSourceOne() throws NamingException {
AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
atomikosDataSourceBean.setXaDataSourceClassName(env.getrequiredProperty("db.driver.xa"));
atomikosDataSourceBean.setUniqueResourceName("dataSourceOne");
atomikosDataSourceBean.setMinPoolSize(10);
atomikosDataSourceBean.setMaxPoolSize(100);
atomikosDataSourceBean.setDefaultIsolationLevel(TransactionDeFinition.ISOLATION_READ_COMMITTED);
Properties properties = new Properties();
properties.put("user",env.getrequiredProperty("db.username"));
properties.put("password",env.getrequiredProperty("db.password"));
String url = env.getrequiredProperty("db.url");
properties.put("URL",env.getrequiredProperty("db.url"));
atomikosDataSourceBean.setXaProperties(properties);
return atomikosDataSourceBean;
}
public DataSource localDataSource() throws NamingException {
AtomikosNonXADataSourceBean atomikosNonXADataSourceBean = new AtomikosNonXADataSourceBean();
atomikosNonXADataSourceBean.setUniqueResourceName("dataSourceTwo");
atomikosNonXADataSourceBean.setDriverClassName(env.getrequiredProperty("db.driver"));
atomikosNonXADataSourceBean.setUser(env.getrequiredProperty("db.username"));
atomikosNonXADataSourceBean.setPassword(env.getrequiredProperty("db.password"));
atomikosNonXADataSourceBean.setUrl(env.getrequiredProperty("db.url"));
atomikosNonXADataSourceBean.setMinPoolSize(10);
atomikosNonXADataSourceBean.setMaxPoolSize(100);
atomikosNonXADataSourceBean.setDefaultIsolationLevel(Isolation.READ_COMMITTED.value());
return atomikosNonXADataSourceBean;
}
问题似乎只针对 Atomikos 和 sql Server 的组合。因为它与两个数据库的 Wildfly 资源一起运行良好,所以问题不在于 sql Server 的配置。这需要特殊的参数或配置吗?
额外的堆栈跟踪:
Caused by: com.microsoft.sqlserver.jdbc.sqlServerException: The Microsoft distributed Transaction Coordinator (MS DTC) has cancelled the distributed transaction.
at deployment.coresuite-war-CSWC-SNAPSHOT.war//com.microsoft.sqlserver.jdbc.sqlServerException.makeFromDatabaseError(sqlServerException.java:262)
at deployment.coresuite-war-CSWC-SNAPSHOT.war//com.microsoft.sqlserver.jdbc.sqlServerResultSet$FetchBuffer.nextRow(sqlServerResultSet.java:5448)
at deployment.coresuite-war-CSWC-SNAPSHOT.war//com.microsoft.sqlserver.jdbc.sqlServerResultSet.fetchBufferNext(sqlServerResultSet.java:1771)
at deployment.coresuite-war-CSWC-SNAPSHOT.war//com.microsoft.sqlserver.jdbc.sqlServerResultSet.next(sqlServerResultSet.java:1029)
at deployment.coresuite-war-CSWC-SNAPSHOT.war//org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93)
和
2021-02-03 16:26:24,297 WARN [com.atomikos.datasource.xa.XAResourceTransaction] (default task-1) XA resource 'springbatch.repositoryDataSource': rollback for XID 'XID: 636F72657375697465544D313631323338373435313631383039323734:636F72657375697465544D3930' raised -4: the supplied XID is invalid for this XA resource: javax.transaction.xa.XAException: The function ROLLBACK: Failed. The status is: -4. Error: "*** sql_XA DTC_ERROR Context: xa_rollback_entry,StatusCode=-4 (0xFFFFFFFC)"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。