我是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)以上场景中的只读操作与读/写操作。
如果有人能澄清上述情况,那就太好了。
感谢。
答案 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")
应使用正确的事务管理器进行事务处理。