使用不同事务管理器的Spring嵌套事务

时间:2013-12-14 23:00:23

标签: java spring hibernate transactions spring-transactions

我是Spring的事务管理的新手,在集成Spring(3.2)和Hibernate(3.6)的同时解决嵌套事务的以下场景时遇到了麻烦。

我已经声明了两个appContext文件如下。

File1)applicationContext-student.xml

    <bean id="studentProjSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
        ...**dataSource1_on_Machine1**...
    </bean>
    <bean id="studentProjTransactionManager"
            class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="studentProjSessionFactory" />
    </bean>
    <tx:annotation-driven transaction-manager="studentProjTransactionManager" />

    <bean id="studentDao" class="com.my.univ.employee.dao.studentHibDao" scope="singleton" />

    <bean id="studentService" class="com.my.univ.student.service.studentServiceImpl" scope="singleton">
            <property name="studentDao" ref="studentDao" />
    </bean>

File2)applicationContext-employee.xml

<bean id="employeeProjSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
            ........**dataSource2_on_Machine2**...
</bean>
<bean id="employeeProjTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="employeeProjSessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="employeeProjTransactionManager" />

<bean id="employeeDao" class="com.my.univ.employee.dao.EmployeeHibDao" scope="singleton" />

<bean id="employeeService" class="com.my.univ.employee.service.EmployeeServiceImpl" scope="singleton">
        <property name="employeeDao" ref="employeeDao" />
</bean>

导入以下文件中的两个文件。

File3)applicationContext-university.xml

<import resource="applicationContext-student.xml" />
<import resource="applicationContext-employee.xml" />

<bean id="personService" class="com.my.univ.person.service.PersonServiceImpl" scope="singleton">
        <property name="studentService" ref="studentService" />
        <property name="employeeService" ref="employeeService" />
</bean>

问题

假设方法级@Transactional注释在studentService和employeeService中提供了正确的txManager名称,但在personService中没有。

Q1)如果我在personService中将一个方法声明为@Transactional,哪个txManager被选中?

Q2)如果层次结构中的txManagers彼此不同,嵌套的txManager方案如何工作?

Ex:如果personService中的@Transactional方法在studentService中调用@Transactional方法,然后在employeeService中调用另一个@Transactional方法(使用与personService相同的方法)。

Q3)提交,回滚元素如何在上述场景中发挥作用。

Q4)以上场景中的只读操作与读/写操作。

如果有人能澄清上述情况,那就太好了。

感谢。

1 个答案:

答案 0 :(得分:0)

@Transactional注释将事务管理器的bean名称作为值。来自documentation

public abstract String value
A qualifier value for the specified transaction.
May be used to determine the target transaction manager, matching the qualifier value (or the bean name) of a specific PlatformTransactionManager bean definition.

Default:
""

所以在你的情况下,明确定义:

@Transactional("studentProjTransactionManager")
@Transactional("employeeProjTransactionManager")

应使用正确的事务管理器进行事务处理。