transactionManager.setDataSource(dataSource); transactionTemplate = new TransactionTemplate(transactionManager); return transactionTemplate.execute(transactionStatus -> { SqlSession sqlSession = null; Connection connection = null; try { // 获取数据库连接 connection = DataSourceUtils.getConnection(dataSource); // connection1.setAutoCommit(false); // 打开 MyBatis 会话 sqlSession = sqlSessionFactory.openSession(connection); // 执行数据库操作 TIndexMapper mapper = sqlSession.getMapper(TIndexMapper.class); // 提交事务 // sqlSession.commit(); return mapper.selectAll(dcIndexDefine.getQuerySql()); } catch (Exception e) { // 回滚事务 // 操作失败,回滚事务 transactionTemplate.execute("XA ROLLBACK 'xid'"); transactionStatus.setRollbackOnly(); if (sqlSession != null) sqlSession.rollback(); e.printStackTrace(); // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } finally { DataSourceUtils.releaseConnection(connection, dataSource); // try { // if (connection1 != null) { // connection1.setAutoCommit(true); // } // // 关闭 MyBatis 会话 // } catch (SQLException e) { // e.printStackTrace(); // } if (sqlSession != null) { sqlSession.close(); } } return null; });怎么在多个动态链接的数据源设置公用的事务管理器
时间: 2024-01-28 10:03:25 浏览: 96
在多个动态链接的数据源设置公用的事务管理器,需要将多个数据源以及事务管理器配置在同一个 Spring 容器中,并且在需要进行事务控制的方法上使用 @Transactional 注解。在注解中,可以指定使用哪个事务管理器来进行事务控制,例如:
```
@Transactional(transactionManager = "multiTransactionManager")
public void multiDataSourceTransactional() {
// ...
}
```
其中,"multiTransactionManager" 为配置在 Spring 容器中的事务管理器名称。在配置事务管理器时,需要将多个数据源注入到事务管理器中,并且可以使用 AbstractRoutingDataSource 类来实现动态切换数据源。具体配置可以参考 Spring 的官方文档。
相关问题
<!--mvc注解--> <mvc:annotation-driven/> <!--注解的组件扫描--> <context:component-scan base-package="com.dgy"/> <!--视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean> <!--加载properties配置文件--> <context:property-placeholder location="classpath:jdbc.properties"/> <!--将数据库驱动注册、连接信息注入datasource--> <bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!--将datasource注入sqlSessionFactory--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="datasource"/> </bean> <!--包扫描:扫描包下所有接口,实例化dao层实现类bean--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.dgy.mapper"/> </bean> <!--事务注解--> <tx:annotation-driven/> <!--aop自动代理--> <aop:aspectj-autoproxy/> <!--将datasource注入transactionManager--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="datasource"/> </bean>解释一下
这段代码是一个Spring MVC项目的配置文件,用于配置一些关键的组件和功能。让我一一解释一下:
1. `<mvc:annotation-driven/>`:启用Spring MVC注解驱动,使得控制器中的注解生效。
2. `<context:component-scan base-package="com.dgy"/>`:指定需要扫描的包,将被注解标记的类作为组件进行扫描。
3. `<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">`:配置视图解析器,用于解析并定位JSP视图文件。
4. `<context:property-placeholder location="classpath:jdbc.properties"/>`:加载属性文件jdbc.properties中的配置信息。
5. `<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">`:配置数据库连接池,使用阿里巴巴Druid连接池。
6. `<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">`:配置MyBatis的SqlSessionFactory,指定数据源。
7. `<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">`:配置MyBatis的Mapper接口扫描器,用于自动扫描并实例化Mapper接口的实现类。
8. `<tx:annotation-driven/>`:启用Spring事务注解驱动,使得注解标记的方法可以被事务管理。
9. `<aop:aspectj-autoproxy/>`:启用AOP自动代理,用于支持基于切面的编程。
10. `<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">`:配置事务管理器,使用Spring的DataSourceTransactionManager,将数据源注入事务管理器。
希望以上解释对您有所帮助!如果您还有其他问题,请随时提问。
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> <property name="transactionManager" ref="transactionManager"/> </bean> <bean id="jbpmOAProcessServiceTransaction" parent="baseTransactionProxy" lazy-init="true"> <property name="target" ref="jbpmOAProcessService" /> <property name="transactionAttributes"> <props> <prop key="*"> PROPAGATION_REQUIRED,-BusinessServiceException </prop> </props> </property> </bean> 这个是部分xml配置
看起来你的配置是正确的。将目标对象jbpmOAProcessService设置为baseTransactionProxy的目标,并将事务属性设置为PROPAGATION_REQUIRED,表示如果当前没有事务,就创建一个新事务;如果已经有事务了,就加入到当前事务中。并且设置了回滚的异常类型BusinessServiceException。
但是,你提到JbpmTemplate的execute方法内部出现异常,事务没有回滚。这个问题可能是由于你的异常类型不是BusinessServiceException或其子类,或者异常被捕获并处理了,没有抛出RuntimeException或其子类。建议你在execute方法中添加日志或调试代码,确保异常被抛出并且类型正确。如果异常类型正确,可以尝试使用@Transactional注解替代TransactionProxyFactoryBean进行事务管理,看看是否可以解决问题。
阅读全文