`
javababy1
  • 浏览: 1240819 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

运用@Transactional,自己抛出异常时不会回滚的原因,经验之谈

阅读更多

查看spring API可知 http://www.kuqin.com/spring2.0_doc/index.html

对EJB来说,默认的行为是EJB容器在遇到系统异常 (通常指运行时异常)时自动回滚当前事务。EJB CMT遇到应用异常 (例如,除了java.rmi.RemoteException 外别的checked exception)时并不会自动回滚。默认式Spring处理声明式事务管理的规则遵守EJB习惯(只在遇到unchecked exceptions时自动回滚),但通常定制这条规则会更有用。

所以

package x.y.service;

public class DefaultFooService implements FooService {

public Foo getFoo(String fooName) {
throw new UnsupportedOperationException();
}

public Foo getFoo(String fooName, String barName) {
throw new UnsupportedOperationException();
}

public void insertFoo(Foo foo) {
throw new UnsupportedOperationException();
}

public void updateFoo(Foo foo) {
throw new UnsupportedOperationException();
}
}

(对该例的目的来说,上例中实现类(DefaultFooService )的每个方法在其方法体中抛出UnsupportedOperationException 的做法是恰当的,我们可以看到,事务被创建出来,响应UnsupportedOperationException 的抛出,然后回滚。)

@Transactional 有关的设置

在最简单的形式下,@Transactional 指定一个接口、类、方法必须是事务性的,其默认事务语义为:read/write,PROPAGATION_REQUIRED ISOLATION_DEFAULT TIMEOUT_DEFAULT ,而且仅当遇到RuntimeException 时回滚,而不是Exception

改变事务设置的其他可选属性

Table 9.1. Transactional 注解的属性

属性 类型 描述
传播性 枚举型:Propagation 可选的传播性设置 (默认值:PROPAGATION_REQUIRED
隔离性 枚举型:Isolation 可选的隔离性级别(默认值:ISOLATION_DEFAULT
只读性 布尔型 读写型事务 vs. 只读型事务(默认值:false ,即只读型事务)
回滚异常类(rollbackFor) 一组 Class 类的实例,必须是Throwable 的子类 一组异常类,遇到时 确保 进行回滚。默认情况下checked exceptions不进行回滚,仅unchecked exceptions(即RuntimeException 的子类)才进行事务回滚。
回滚异常类名(rollbackForClassname) 一组 Class 类的名字,必须是Throwable 的子类 一组异常类名,遇到时 确保 进行回滚
不回滚异常类(noRollbackFor) 一组 Class 类的实例,必须是Throwable 的子类 一组异常类,遇到时确保 回滚。
不回滚异常类名(noRollbackForClassname) 一组 Class 类的名字,必须是Throwable 的子类 一组异常类,遇到时确保 回滚

我们推荐你参考 @Transactional 注解的javadoc,其中详细列举了上述各项属性及其可选值。

————————————————————————————————————

通过以上可知,在spring 中运用@Transactional 注解,自己抛出异常UnsupportedOperationException会 回滚,抛Exception异常,得作相关的配置才会回滚。

分享到:
评论

相关推荐

    后端 Java Spring Data Jpa @Transactional 介绍

    如果抛出了未检查异常或检查异常且在`@Transactional`注解中指定了可传播的异常类型,事务将被回滚。 例如,以下代码展示了如何在Spring Data JPA的Service层使用`@Transactional`: ```java @Service public ...

    Spring中@Transactional事务回滚(含实例

    1. **默认回滚规则**:如果在`@Transactional`方法中抛出未检查异常(继承自`RuntimeException`的异常)或者`Error`,Spring将自动回滚事务。 2. **非默认回滚规则**:对于受检异常(即没有继承自`RuntimeException`...

    Spring中的@Transactional事物回滚实例源码

    在这个例子中,`createUser`方法被标记为事务性的,如果在方法内部抛出未捕获的异常,Spring会自动回滚事务,确保数据一致性。 Spring事务管理的工作流程大致如下: 1. **AOP代理**:Spring使用AOP(面向切面编程)...

    浅谈Spring中@Transactional事务回滚及示例(附源码)

    这些异常必须在代码中显式地处理,例如使用try-catch块处理,或者给所在的方法加上throws说明,将异常抛到调用栈的上一层。checked异常继承自java.lang.Exception。 unchecked异常是指程序的逻辑错误,例如...

    Spring3事务管理——使用@Transactional 注解.rar

    默认情况下,运行时异常(如`RuntimeException`)会触发回滚,而检查异常(非运行时异常)则不会。 - 可以自定义回滚规则,通过`rollbackFor`和`noRollbackFor`属性来控制。 4. **配置事务管理器** - 需要在...

    什么情况会导致@Transactional事务失效?

    如果在方法内部捕获了所有异常并重新抛出,或者返回了错误代码而非抛出异常,事务可能不会按照预期进行回滚。 5. ** propagation 设置不当**:`@Transactional`的propagation属性决定了事务如何在方法间传播。如果...

    @Transactional实现原理.txt

    @Transactional实现原理.txt

    springboot中事务管理@Transactional的注意事项与使用场景

    2. 默认回滚机制:Spring 基于注解的声明式事物 @Transactional 默认情况下只会对运行期异常(java.lang.RuntimeException 及其子类)和 Error 进行回滚。 3. 数据库引擎支持:数据库引擎要支持事务,使用 InnoDB。 ...

    Spring @Transactional工作原理详解

    在Spring框架中,`@Transactional`注解是一个强大的工具,用于声明式地管理事务。它使得开发者无需显式地在代码中控制事务的开始、提交和回滚,从而提高了代码的可读性和可维护性。下面我们将深入探讨`@...

    Spring @Transactional注解失效解决方案

    如果在没有事务的环境下被调用,容器抛出例外。 5. SUPPORTS:该方法在某个事务范围内被调用,则方法成为该事务的一部分。如果方法在该事务范围外被调用,该方法就在没有事务的环境下执行。 6. NEVER:该方法绝对不...

    Spring声明式事务@Transactional知识点分享

    在使用 @Transactional 注解时,需要注意以下几点: * @Transactional 注解可以应用于类或方法上。 * 如果在类上使用 @Transactional 注解,那么该类中的所有方法都会继承该注解的属性。 * 如果在方法上使用 @...

    spring 自定义事务管理器,编程式事务,声明式事务@Transactional使用

    `@Transactional`可以设置不同的属性,如`propagation`(传播行为)、`isolation`(隔离级别)、`rollbackFor`(触发回滚的异常类型)等。下面是一个声明式事务的例子: ```java @Service public class UserService...

    Java注解@Transactional事务类内调用不生效问题及解决办法

    然而,在某些情况下,@Transactional注解可能不会生效,例如在同一个类中的方法调用时。这是因为Spring的AOP代理机制的限制所致。 在Spring框架中,@Transactional注解是通过AOP代理来实现事务管理的。在默认情况下...

    spring的@Transactional注解详细用法1

    如果方法抛出异常,事务则会被回滚,以此确保事务的ACID(原子性、一致性、隔离性和持久性)特性。 在Spring中,事务管理器(如`DataSourceTransactionManager`)会确保每个事务都在一组相关操作之间保持一致。例如...

    spring 简单实例 事务回滚

    4. 异常处理:为了触发事务回滚,方法内通常会抛出未检查异常(继承自`RuntimeException`的异常)或显式指定需要回滚的检查异常。Spring默认只在遇到未检查异常时自动回滚事务,如果需要在特定检查异常下回滚,可以...

    带有@Transactional和@Async的循环依赖问题

    但需要注意,`@Lazy`与`@Async`和`@Transactional`一起使用时可能不会按预期工作,因为`@Lazy`可能会影响到事务和异步的处理。 总的来说,理解Spring的依赖注入机制以及`@Transactional`和`@Async`的工作原理是解决...

    Spring事务管理A方法内部调用B方法的回滚问题测试代码

    然而,如果`methodB`的异常没有被捕获并重新抛出,而是被忽略或者处理了,那么Spring可能无法检测到这个异常,从而不会回滚`methodA`的事务。因此,捕获并重新抛出异常是至关重要的,如示例代码所示。 此外,需要...

    spring @Transactional 无效的解决方案

    "Spring @Transactional 无效的解决方案" Spring框架中的@Transactional注解是用来实现事务管理的,但是有时候我们可能会遇到@Transactional注解无效的情况。在这篇文章中,我们将 introducethe 解决方案,并通过...

Global site tag (gtag.js) - Google Analytics