2013-12-14 61 views
0

我是Spring的事務管理新手,在集成Spring(3.2)和Hibernate(3.6)時遇到了嵌套事務的以下情形。Spring與不同事務管理器的嵌套事務

我宣佈了兩個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> 

文件2)的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> 

在以下文件中上述兩個文件導入。

文件3)的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但不是在personService正確txManager名該方法的水平。

Q1)如果我在personService中聲明一個方法爲@Transactional,哪個txManager被選中?

Q2)如果層次結構中的txManagers彼此不同,嵌套txManager方案如何工作?例如:如果personService中的@Transactional方法調用studentService中的@Transactional方法,然後調用employeeService中的另一個@Transactional方法(使用與personService相同的方法)。

Q3)提交,回滾元素如何在上述場景中工作。

Q4)上述場景中的只讀操作與讀/寫操作。

如果有人能夠澄清上述情況,那將會很棒。

謝謝。

回答

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") 

應該穿得事務使用正確的事務管理器。

+0

感謝您的回覆。如果我沒有指定txName,但只定義了註釋,哪個txManager將在personService中被挑選出來? – phani

+0

不知道哪一個正在被拾取,你可以在運行時檢查一個斷點正在被加載。但是有沒有理由不定義事務管理器特別是現在你明確定義了其中的兩個? – dimitrisli

+0

感謝您的回覆。我可以在student和employeeService中明確聲明它。問題是,如果我在personService中將tx定義爲studentTx,並執行一些與employeeTxManager內嵌的層次結構,是否會起作用? – phani