【发布时间】:2017-09-24 03:27:50
【问题描述】:
我有一个 grails (2.5.2) 应用程序,具有 mysql 和 NoSQL 交互。有一个 main/principal 服务方法调用另外 2 个方法:
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 数据库中。(这是问题所在)
包含所有这些程序执行的保存方法被标记为@Transactional,因此如果 noSQLDataAccessService.set() 抛出异常,则不应应用所做的所有更改,因为回滚。我是对的?
【问题讨论】: