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