java - 事务不工作(Manager tx 问题)
问题描述
再会!我的问题是,当我将另一个数据库的配置从 xml 转移到 @Bean 时,我的事务丢失了....不要回滚并且不起作用。我在第一次插入创建行(!)后在数据库中看到了这一点,但是在这种方法(事务)中开始第二次插入,我在第一次插入后采取异常和行留在数据库上!
这个xml
<bean name="sqlSessionFactoryYarus" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="/WEB-INF/MapperConfigYarus.xml" />
<property name="dataSource" ref="dataSourceYarus" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="ru.project.crm.mapper_yarus"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryYarus" />
</bean>
<bean id="transactionManagerYarus" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceYarus" />
<qualifier value="yarus"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManagerYarus" />
这个代码(dataSource没有这个不浪费空间)
@Component
@Scope("singleton")
@DependsOn("springApplicationContextHolder")
public class YarusConnectionConfig {
@Bean
public SqlSessionFactory sqlSessionFactoryYarus() throws Exception {
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSourceYarus());
sqlSessionFactory.setConfigLocation(new ClassPathResource("../MapperConfigYarus.xml"));
return sqlSessionFactory.getObject();
}
@Bean
public MapperScannerConfigurer yarusMapper() throws Exception {
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setSqlSessionFactoryBeanName("sqlSessionFactoryYarus");
msc.setBasePackage("ru.project.crm.mapper_yarus");
return msc;
}
@Bean
public DataSourceTransactionManager transactionManagerYarus() throws Exception {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSourceYarus());
return dataSourceTransactionManager;
}
}
和
当我想对事务进行注释时的所有步骤@Transactional(value = "transactionManagerYarus") 如果我使用 xml Transactional 构建项目可以正常工作但是如果使用@Bean 构建它就不起作用...
请帮帮我!
我用
1) 弹簧 4.3
2) MyBatis
3)Postgesql
4)Java 8
解决方案
我们也找到解决方案。问题出在数据源中
@Bean(destroyMethod = "close", name = "dataSourceYarus")
public ComboPooledDataSource dataSourceYarus() {
ComboPooledDataSource cpds = new ComboPooledDataSource();
//config connection
}
它是我的 bean,我称这个 bean 为类似方法,例如
new DataSourceTransactionManager(dataSourceYarus());
我对此并不重视,因为在所有示例中都是如此。但是在 xml 配置中导致这个名字像“Bean”,我将 java-config 中的调用替换为
new DataSourceTransactionManager(context.getBean("dataSourceYarus"))
和....这对我有用!因为如果调用这个方法,每次创建新池然后事务就结束了
推荐阅读
- java - HashMap 不能强制转换
- python - 如何将 Google 的 Geocode API 与批量地址一起使用
- celery - 芹菜链组
- r - R markdown 全局选项警告=FALSE 未按预期工作
- bash - bash 命令输出“没有这样的文件或目录”
- python - PIL ValueError:图像不匹配
- kotlin - 如果 Elvis 运算符的两个表达式都为 null,那么选择哪一个?
- html - css:在锚标记上添加背景图像 URL
- javascript - 使用 Javascript DOM 在 Header 中附加元素,并将其作为 Angular JS 中所有网页共享的公共标头
- excel - 如何停止重新打开工作簿?