私は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()が例外をスローすると、すべての変更は適用されませんロールバックのためです。私は正しい?