当前位置: 首页 > 知识库问答 >
问题:

如何在事务上下文中使用finally block处理异常?

宰父子安
2023-03-14

如果我有下面这样的事务方法,在事务提交和回滚的情况下,最后一个块是什么时候执行的?例如,如果“使用hibernate在数据库中持久化某个实体”引发了一些hibernate异常,这是真的吗?

1) 事务回滚2)最后执行块

或者

1)最后执行块2)事务回滚

public void someTransactionalPersist(...) {
     try {
     // persist some entity in database with hibernate
     } finally {
        // do something 
     }
}

共有3个答案

郑波
2023-03-14

假设someTransactionalPersist方法是事务的起点,那么如果try块中有任何异常,那么first finally将被执行,如果finally块抛出运行时异常,那么spring将作为默认配置进行回滚。

如果你想回滚为perticular异常,那么你必须配置@Transactionalrollback For

如果您想手动将事务标记为回滚,而不会进一步抛出异常/运行时异常,那么您必须在捕获块中执行此操作TransactionAbooSupport.currentTransactionState(). setRollbackOnly()

江丰羽
2023-03-14
try{
    //This is executed if an exception is not thrown
} catch(Exception e){
    //This is executed if an exception is thrown
} finally{
    //This is executed regardless of which of the above was executed
}
阴高刚
2023-03-14

在这两种情况下,finally块将最终执行。序列将是,如果您的try block抛出异常,那么它将首先回滚,然后最后执行block执行

 类似资料:
  • 我有一个函数,是递减用户信用的firebase实时数据库值与事务。正如Firebase事务API调用中所建议的,当前数据为空事务当前值偶尔返回为空。 第二次调用当前值:0 第二次调用中止 首次调用电流值:5 第一次呼叫返回5-3 首次呼叫成功 第二次调用不提交 因此,当用户有足够的信用时,第二个收费电话最终没有通过。处理firebase事务空值情况的正确方法是什么?

  • 代码错误 行,我在控制台中得到如下错误:无法找到元素:{“method”:“id”,“selector”:“loginusername”}命令持续时间或超时:262毫秒

  • 无法使用由try和catch块包围的@controlleradvice和@afterthollow when方法。 我可以一步一步解释 }

  • 我正在用JPA在Spring中实现一个应用程序,并将其部署在weblogic服务器中。我想知道如何处理交易。对于数据库配置,我配置了persistence.xml将事务类型声明为JTA。在我的持久性逻辑中,当更新一些东西时,我使用这个逻辑: 但它抛出了一个例外。如果我不提交,数据库表中的数据就不会更新。即使我尝试在方法级别声明@Transactional,它也不起作用。有没有人能告诉我如何处理交易

  • 我们正在Wildfly11上开发,需要回答一个时间紧迫的rest调用(低于300ms)。我已经调整了计算结果的算法,使其回答低于这个阈值。但是在我回答之后,我想用计算结果触发一些预处理(创建一个对象,将其存储在数据库中)。 这个预处理器注入部分sessionscoped的服务。 CDI2.0提供了一个FireSync on事件,但是Wildfly11只包含CDI1.2。所以这不是一个选择。

  • 我目前正在尝试为spring boot实现一个自定义的错误处理程序,我已经用以下方法实现了它: 不知为什么这不起作用,并且异常仍然被抛给客户端,是否有某种方法捕获方法抛出的异常并忽略它。