分布式事务回滚是直接抛异常就会回滚吗,还是必须要在调用方抛异常才会回滚
时间: 2023-04-10 16:01:50 浏览: 131
对于这个问题,我可以回答:分布式事务回滚并不是直接抛异常就会回滚,而是需要在代码中进行事务管理,当出现异常时,事务管理器会自动回滚事务。因此,调用方抛出异常只是触发了事务管理器的回滚机制,而不是直接导致事务回滚。
相关问题
事务传播两个事务都用trycatch,那抛出异常还会回滚么
如果在事务传播过程中的每个事务中都有 try-catch 块,那么如果其中一个事务抛出了异常并被捕获,那么该事务会回滚,而其他事务也会回滚,因为它们都处于同一个事务上下文中。这是因为在 Spring 中,异常会沿着调用链向上抛出,直到被捕获或者导致事务回滚。如果异常被捕获,则事务会回滚,否则事务会提交。因此,如果你想要回滚事务,你需要在 catch 块中重新抛出异常,让其继续向上抛出,直到被事务管理器捕获并回滚整个事务。
.事务注解@transactional的属性知道哪些,其中默认异常回滚是哪个,并且什么异常才会不回滚
事务注解@Transaction的属性有以下几个:
1. propagation:事务传播行为,默认值为REQUIRED。它定义了当一个方法被另外一个事务性方法调用时,当前的事务是挂起还是继续执行。
2. isolation:事务隔离级别,默认值为DEFAULT。它定义了在并发环境下事务之间的隔离程度,如READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ和SERIALIZABLE等。
3. timeout:事务超时时间,默认值为-1,表示不超时。
4. readOnly:标识事务是否为只读事务,默认值为false。如果设置为true,事务将只读取数据而不会修改数据,可以优化事务性能。
5. rollbackFor:发生哪些异常时进行事务回滚,默认值为{},表示任何异常都会回滚。可以通过指定异常的Class数组来定义特定的异常,例如{Exception.class}。
6. noRollbackFor:发生哪些异常时不进行事务回滚,默认值为{},表示任何异常都会回滚。可以通过指定异常的Class数组来定义特定的异常,例如{RuntimeException.class}。
默认的异常回滚属性是RuntimeException及其子类异常,包括DataAccessException,默认情况下,即使发生RuntimeException及其子类异常,事务也会进行回滚。但是,对于其他类型的异常(如Checked Exception),默认情况下事务是不会回滚的,除非在rollbackFor属性中指定了这些异常。
总结起来,事务注解@Transaction的属性包括传播行为、隔离级别、超时时间、只读、回滚异常和不回滚异常等。默认的异常回滚为RuntimeException及其子类异常,其他异常需要在rollbackFor属性中指定才会进行回滚。