我正在做一个遗留的grails 2.5.6项目。
作为逻辑的一部分,当检测到孤立记录时,将引发异常(RuntimeException的类型)。这样做时,必须删除孤立的记录。这种逻辑深入服务方法调用的各个层,这些服务方法调用位于一个较大的事务块中(默认情况下)。
这是一个示例代码:
...
financialTransactionItem.delete(flush:true); /* flush: true is for a reason here */
throw new ServiceException(...);
...
但是,显然,当抛出ServiceException(源自RuntimeException)并且孤立记录(financialTransactionItem)停留在此位置时,删除操作会回滚。
回滚仍然是必需的,因为必须丢弃其他数据库事务。
我的问题是:我该怎么做?即回滚除指定删除操作之外的所有内容?
最佳答案
我将delete语句包含在withNewTransaction(...)块中,并且回滚不会影响删除操作。
FinancialTransactionItem.withNewTransaction {TransactionStatus status ->
FinancialTransactionItem obsoleteFinancialTransactionItem = FinancialTransactionItem.get(ftiItemId);
if(obsoleteFinancialTransactionItem){
obsoleteFinancialTransactionItem.delete(flush: true);
}
}