在 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);
}
}
我正在处理旧版 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);
}
}