我正在从iBatis 2.3迁移到MyBatis 3.2.8。一切进展顺利,但在交易和批量操作方面我确实有一个问题。在https://mybatis.github.io/spring/sqlsession.html的底部,它说:
此形式的警告是,在调用此方法时,不能运行具有不同ExecutorType的>现有事务。确保>调用具有不同执行程序类型的SqlSessionTemplates在单独的>事务中运行(例如使用PROPAGATION_REQUIRES_NEW)或完全在>事务之外运行。
我有一个使用@Transactional注释的服务调用,可以进行多个Dao调用:
@Override
@Transactional
public void saveMassUploadOrder(List<IndividualOrder> orders) {
List<IndividualOrderItem> ioItems = new ArrayList<IndividualOrderItem>();
for (IndividualOrder order : orders) {
ioItems.addAll(order.getIoItems());
}
individualOrderDao.insertBatch(orders);
individualOrderItemDao.insertBatch(ioItems);
}
DAO看起来像:
public class IndividualOrderDAOImpl implements IndividualOrderDAO{
private SqlSession sqlSession;
public void setSqlSession(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
public void insertBatch(final List<IndividualOrder> orders) {
for (IndividualOrder order: orders){
sqlSession.insert("namespace.insert", order);
}
}
}
配置如下:
<bean id="batchSqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="doeSqlSessionFactory" />
<constructor-arg index="1" value="BATCH" />
</bean>
<bean id="individualOrderDao" class="com.doe.mybatis.jdoe.dao.IndividualOrderDAOImpl">
<property name="sqlSession" ref="batchSqlSession" />
</bean>
<bean id="individualOrderItemDao" class="com.doe.mybatis.jdoe.dao.IndividualOrderItemDAOImpl">
<property name="sqlSession" ref="batchSqlSession" />
</bean>
那么 - 这个服务调用中的多个DAO调用是否正常,因为服务正在打开一个事务并且它不能以批处理模式工作并调用这些DAO?显然,如果在执行期间某处出现故障,我希望调用此服务实际上不会插入任何订单或订单项。
我还没有迁移这些DAO,我可能会在测试批量插入过程中设置一个灾难性事件并检查数据,我只是想在得到其他意见之后才开始看我是否需要设置不同或不同。
任何帮助表示赞赏!