2017-04-26 14 views
0

私はmysqlとNoSQLのやりとりをするgrails(2.5.2)アプリを持っています。 2つの他のメソッドを呼び出す元本/メインサービスメソッドがあります:あなたが見ることができるようにGrails/Springのトランザクション動作がこの場合にはうまくいかないのはなぜですか?

class mainService { 

    static transactional = false 
    NoSQLDataAccessService noSQLDataAccessService 

    // main/principal method 
    @Transactional 
    void save(json){ 

    // (1) creating domain entities from json 
    addNewDomainEntities(entities) 

    // (2) 
    noSQLDataAccessService.set(json) 
    } 

    @Transactional 
    void addNewDomainEntities(entities){ 
    // save the entities in a mysql schema and use save(flush:true) 
    // because i need the generated id's 
    } 

} 

は、このmainServiceは新しいドメインエンティティを作成し(1)、IDを取得するためにセッションをフラッシュします。時々noSQLDataAccessService.setは、()外部要因で失敗し、まだ前に作成されたエンティティは、MySQLに固執、

class NoSQLDataAccessService(){ 

    static transactional = false 

    void set(json){ 
    try{ 
    // save the json in a NoSQL schema 
    } catch(Exception ex){ 
     // if fails, i log the exception and throws it again 
     throws ex 
    } 
    } 
} 

しかし:その後、私は、NoSQLのスキーマでJSONを保存する他のサービスの方法(2)を呼び出します(この問題は)

このプログラムの実行をすべて含むsaveメソッドは@Transactionalのようにマークされているため、noSQLDataAccessService.set()が例外をスローすると、すべての変更は適用されませんロールバックのためです。私は正しい?

答えて

1

this StackOverflow conversationのようにロールバックを強制するには、例外ではなくRuntimeExceptionをスローする必要があります。代わりに:

throws ex 

あなたは試してみてください:

throw new RuntimeException(ex) 

さらに、私はあなたのトランザクション分離についての明示的なことをお勧めします。おそらく次のようなものでしょう:

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE) 
関連する問題