2017-04-26 134 views
0

我有一个grails(2.5.2)应用程序,有一个mysql和一个NoSQL交互。有调用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。然后,我打电话了JSON存储在NoSQL的架构等服务方法(2):

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 
    } 
    } 
} 

但是,有时noSQLDataAccessService.set()失败的外部原因之前仍会创建实体坚持在mysql db。(这是问题)

包含所有此程序执行的save方法标记为@Transactional,因此如果noSQLDataAccessService.set()引发异常,则应该不应用所做的所有更改因为回滚。我是对的?

回答

1

根据this StackOverflow conversation,您可能必须抛出RuntimeException而非Exception,才能强制回滚。相反的:

throws ex 

你可以尝试:

throw new RuntimeException(ex) 

此外,我建议你可以明确你的事务隔离。也许是这样的:

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE) 
相关问题