@Transactional
メソッド a、b、c など、 のマークが付いたメソッドがいくつかあるサービスがあります。これら 3 つのメソッドは、a -> b -> c のようにネストされています。コードサンプルは次のとおりです。
@Transactional
public void a() {
while(condition) {
try {
b();
} catch(MyException e) {
logger.warn(e.getMessage());
}
}
}
ただし、メソッド b には次のように注釈が付けられています。
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = {MyException.class})
ただし、MyException
がメソッド c からスローされると、メソッド a で例外がキャッチされ、メソッド a が終了すると、トランザクションがコミットされます。これには、例外をスローした b() の呼び出しによって実行され、ロールバックされるべきだったものがすべて含まれます(? )。私はSpring 3.0.7でSQL Server 2012 Expressを使用しています.Springの構成は次のとおりです。
<tx:annotation-driven />
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<qualifier value="txm1"/>
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="dataSource" ref="dataSource"/>
<property name="persistenceXmlLocation" value="classpath:META-INF/jpa-persistence.xml"/>
<property name="persistenceUnitName" value="Unit1" />
</bean>