【问题描述】
springboot应用部署在PAS中,具体接口测试场景如下:
先进行数据插入,而后程序报错,由于添加了事务,正常数据应该回滚,但是目前数据还是进了库
【解决方案】
问题原因:
一般Springboot下包含DataSourceTransactionManager与JtaTransactionManager等事务管理器。
- JtaTransactionManager应用于JNDI下的事务管理。
- DataSourceTransactionManager应用于普通JDBC下事务管理。
通常JDBC事务需要DataSourceTransactionManager事务管理器,而由于某些版本SpringBoot下的JtaTransactionManager比DataSourceTransactionManager事务管理器优先级更高,所以导致事务回滚不生效。
项目中解决方案:
项目添加JDBC事务管理器配置,优先开启DataSourceTransactionManager。具体配置参考如下代码:
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
/**
* @author William.Q
*/
@Configuration
public class DataSourceTransactionManagerConfiguration {
@Primary
@Bean
DataSourceTransactionManager transactionManager(DataSource dataSource,
ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
transactionManagerCustomizers.ifAvailable((customizers) -> customizers.customize(transactionManager));
return transactionManager;
}
}
【原文链接】
http://doc.primeton.com/pages/viewpage.action?pageId=82157148