我正在开展一个迁移项目,其中包括使用MyBatis将平台升级到Spring 4。在遗留代码中,事务在中心位置处理,其中对开始/结束事务的调用分布在各种类中,如服务类,辅助类和DAO类。
我设法将所有服务类转换为spring托管组件和DAO类,以支持MyBatis-spring API。问题是我的服务类使用其他几个类来执行一个函数,这些类都是手动实例化并使用的。现在,如果我在服务类方法上启动事务并在非Spring管理的其他帮助程序或DAO类中执行数据库事务,则我的事务处理无法正常工作。我在下面的代码中说明了这个问题。你能告诉我们在不修改代码的情况下实现事务处理的方法是什么?
示例:
package com.service;
@Service
class MyService {
@Transactional( propagation=Propagation.REQUIRED)
public void processRequest () {
HelperClass helper = new HelperClass();
helper.performOperation();
}
}
package com.helper;
// this class is not spring bean
class HelperClass {
// MyBatis mapper class
private EmployeeMapper mapper;
public HelperClass () {
mapper = // retrieve mapper class bean from spring context
}
public performOperation () {
// call to mapper class insert operation
// call to mapper class update operation
}
}
package com.dao;
@Component
interface EmployeeMapper {
// method definition to perform database operation
}
Spring配置详细信息:
<context:component-scan base-package="com" />
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
....
....
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" mode="aspectj" />
<mybatis:scan base-package="com.dao" />
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations"
value="classpath*:mybatis/*.xml" />
</bean>
在上面的代码中,HelperClass.performOperation()方法正在进行2次数据库操作(插入,更新)。假设插入成功并且更新失败,我的数据库事务不会回滚。因为我已经在MyService.processRequest()启动了事务,所以这不会回滚该方法调用中携带的操作吗?如果我的理解是错误的,请纠正我。