2013-06-13 12 views
5

Spring MVC 3.1プロジェクトで注釈ベースのトランザクションを使用していて、例外がスローされたときにトランザクションがロールバックされません。ここでSpringトランザクションが例外でロールバックしない(Oracle JNDIデータソース)

は、だから私のサービスコード


@Service 
public class ImportService { 

    @Autowired 
    ImportMapper importMapper; 

    @Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED, rollbackFor=Throwable.class) 
    public void processImport() throws ServiceException, DatabaseException { 
     iImport import = new Import(); 

     createImport(import); 

     throw new ServiceException("");   
    } 

    @Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED, rollbackFor=Throwable.class) 
    private void createImport(Import import) throws DatabaseException { 
     try { 
      importMapper.createImport(eventImport); 
     } catch (Exception e) { 
      throw new DatabaseException(e); 
     } 
    } 

で例外がスローされた後、うまくいけば、createImport方法はロールバックされなければなりません。しかし、残念ながらそうではありません。

私は、サーバーのcontext.xml

<Resource name="datasource.import" auth="Container" type="javax.sql.DataSource" 
      maxActive="100" maxIdle="30" maxWait="10000" 
      username="user" password="password" driverClassName="oracle.jdbc.driver.OracleDriver" 
      url="jdbc:oracle:thin:@INFO" /> 

で私のデータソースを定義していると私は、JNDIでそれを探しています:

<jee:jndi-lookup id="dataSource" jndi-name="datasource.import"/> 

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

<tx:annotation-driven /> 

私はOracleデータベースを使用して、JDBCよspecはデフォルトでauto commitが真であると言います。明示的に偽に設定すると助けになると思っていましたが、それをどうやって行うのか分かりません。

OracleデータソースをJNDIでルックアップする際に、ロールバックが機能する方法はありますか。

+1

私は私の問題を解決しましたが、問題は当初考えていたものではありませんでした。トランザクションBeanは、間違ったコンテキストファイルで定義されていました。私はそれらを根本的な文脈で持っていた。 この問題は、私の問題を解決するのに役立ちました:http://stackoverflow.com/questions/10538345/spring-transactional-annotations-ignored –

+0

この質問は、実際の問題は本文に記載されていないので、 。 – APC

答えて

5

春のトランザクション管理は、チェックされていない例外(RuntimeException)のトランザクションのみをロールバックすることに注意してください。チェックされた例外についてもロールバックを実行する場合は、その例外を定義する必要があります。

When using annotations as attribute source、あなたは、トランザクションがロールバックにさせる必要がある例外クラス、(のJavaDocから引用)のリストをrollbackFor属性を提供する必要があります。

/** 
* Defines zero (0) or more exception {@link Class classes}, which must be a 
* subclass of {@link Throwable}, indicating which exception types must cause 
* a transaction rollback. 
* <p>This is the preferred way to construct a rollback rule, matching the 
* exception class and subclasses. 
* <p>Similar to {@link org.springframework.transaction.interceptor.RollbackRuleAttribute#RollbackRuleAttribute(Class clazz)} 
*/ 
Class<? extends Throwable>[] rollbackFor() default {}; 
+0

定義されています。 Transactional注釈にはrollbackFor = Throwable.classがあります。 –

0

それがあれば、と言われています@transationalメソッドは別の@transationalメソッドによって呼び出されますが、最初のメソッドは動作しません。最初の@transationalを削除して試してみてください。