在 grails 2.5.6 的运行时异常期间,如何隔离单个 delete(..) 不被回滚?

How can I isolate a single delete(..) from being rolled back during runtime exception in grails 2.5.6?

我正在处理旧版 grails 2.5.6 项目。

作为逻辑的一部分,当检测到孤立记录时会抛出异常(RuntimeException 类型)。这样做时,必须删除孤立的记录。此逻辑深入到大事务块中的服务方法调用层(默认情况下)。

这是一个示例代码:

...
financialTransactionItem.delete(flush:true); /* flush: true is for a reason here */
throw new ServiceException(...);
...

但是,很明显,当抛出 ServiceException(派生自 RuntimeException)并且孤立记录 (financialTransactionItem) 保留在那里时,删除被回滚。

回滚仍然是必要的,因为还有其他数据库事务必须丢弃。

我的问题是:我怎样才能做到这两点?即回滚除指定删除操作之外的所有内容?

我将删除语句包含在 withNewTransaction(...) 块中,回滚不影响删除操作。

FinancialTransactionItem.withNewTransaction {TransactionStatus status ->

    FinancialTransactionItem obsoleteFinancialTransactionItem = FinancialTransactionItem.get(ftiItemId);

    if(obsoleteFinancialTransactionItem){

        obsoleteFinancialTransactionItem.delete(flush: true);
    }
}