非春季托管bean

时间:2016-04-06 02:35:49

标签: spring transactions

我正在开展一个迁移项目,其中包括使用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()启动了事务,所以这不会回滚该方法调用中携带的操作吗?如果我的理解是错误的,请纠正我。

0 个答案:

没有答案