Spring中的@Transactional注解使用详解

 更新时间:2024年01月30日 09:23:04   作者:小小懒懒  
这篇文章主要介绍了Spring中的@Transactional注解使用详解,@Transactional 是一个注解,用于在 Spring 框架中管理事务的声明式事务管理机制,它可以应用于方法或类级别,并指示方法或类在执行时应该被包装在一个事务中,需要的朋友可以参考下

@Transactional 注解介绍

@Transactional 是一个注解,用于在 Spring 框架中管理事务的声明式事务管理机制。

它可以应用于方法或类级别,并指示方法或类在执行时应该被包装在一个事务中。

使用 @Transactional 注解的方法在执行时会被 Spring 框架自动处理事务的起始、提交或回滚等操作,简化了事务管理的编码工作。

  • 当方法执行成功时,事务会被提交,数据的变更会持久化到数据库;
  • 当方法执行失败时,事务会被回滚,之前的数据变更会被撤销。

@Transactional 注解的常见属性和行为

  • propagation:指定事务的传播行为。它定义了事务方法被另一个事务方法调用时,事务应该如何传播。常用的传播行为包括 REQUIRED、REQUIRES_NEW、NESTED 等。
  • isolation:指定事务的隔离级别。它定义了事务方法在并发环境中处理数据一致性的程度,包括 DEFAULT、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE 等级别。
  • readOnly:指定事务是否为只读。如果设置为 true,则表示事务只读,不会对数据进行修改。这样可以提高数据库的读取性能。
  • timeout:指定事务的超时时间(以秒为单位)。如果事务执行时间超过指定的超时时间,事务将被回滚。
  • rollbackFor 和 noRollbackFor:用于指定在遇到特定的异常时事务是否回滚。可以设置特定的异常类,或者使用异常类的父类或接口。
  • rollbackOn 和 noRollbackOn:与 rollbackFor 和 noRollbackFor 类似,用于指定在遇到特定的异常类型时事务是否回滚,但使用的是异常类的名字字符串。
  • value 和 transactionManager:用于指定事务管理器的名称。如果应用中存在多个事务管理器,可以通过这两个属性指定使用哪个事务管理器。

以下是一个示例代码,展示了 @Transactional 注解的使用:

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false)
public void saveOrder(Order order) {
    // 保存订单的逻辑
    // ...
}
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
public void updateProductQuantity(String productId, int quantity) {
    // 更新产品库存的逻辑
    // ...
}

在上述示例中,saveOrder 方法和 updateProductQuantity 方法都被 @Transactional 注解修饰,表示它们会在事务中执行。

saveOrder 方法使用默认的传播行为和隔离级别,而 updateProductQuantity 方法指定了传播行为为 REQUIRED,隔离级别为 READ_COMMITTED。

需要注意的是,@Transactional 注解只能应用于公共方法。当调用被注解的方法时,事务的生效是通过 Spring AOP 实现的,所以该注解需要在 Spring 管理的 Bean 中才能生效。

同时,建议将 @Transactional 注解应用在业务层而非持久层,以便事务的粒度更加明确和控制。

总结

要知道@Transactional注解里面每个属性的含义。@Transactional注解属性就是来控制事务属性的。通过这些属性来生成事务。

要明确我们添加的@Transactional注解会不会起作用。

@Transactional注解在外部调用的函数上才有效果,内部调用的函数添加无效,要切记。这是由AOP的特性决定的。

要明确事务的作用范围,有@Transactional的函数调用有@Transactional的函数的时候,进入第二个函数的时候是新的事务,还是沿用之前的事务。稍不注意就会抛UnexpectedRollbackException异常。

到此这篇关于Spring中的@Transactional注解使用详解的文章就介绍到这了,更多相关@Transactional注解使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • RestTemplat中关于getForobject方法的使用

    RestTemplat中关于getForobject方法的使用

    这篇文章主要介绍了RestTemplat中关于getForobject方法的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 深入理解JAVA抽象类和接口的比较与异同

    深入理解JAVA抽象类和接口的比较与异同

    这篇文章主要为大家详细介绍了JAVA抽象类和接口的比较,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 深入理解java虚拟机的故障处理工具

    深入理解java虚拟机的故障处理工具

    大家都知道在给系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。Java开发人员可以在jdk安装的bin目录下找到除了java,javac以外的其他命令。这些命令主要是一些用于监视虚拟机和故障处理的工具,下面来看看详细的介绍。
    2016-11-11
  • Java设计模式详解之门面模式(外观模式)

    Java设计模式详解之门面模式(外观模式)

    为子系统中的一组接口提供一个一致的界面, Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。本文给大家介绍Java设计模式详解之门面模式(外观模式),感兴趣的朋友参考下吧
    2016-04-04
  • java实现简单发送邮件功能

    java实现简单发送邮件功能

    这篇文章主要为大家详细介绍了java实现简单发送邮件功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Spring事务aftercommit原理及实践

    Spring事务aftercommit原理及实践

    这篇文章主要为大家介绍了Spring事务aftercommit原理及实践,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Maven工程pom中如何定义jdk版本

    Maven工程pom中如何定义jdk版本

    这篇文章主要介绍了Maven工程pom中如何定义jdk版本,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Calcite使用SQL实现查询excel内容

    Calcite使用SQL实现查询excel内容

    因为calcite本身没有excel的适配器, 所以本文将模仿calcite-file, 搞一个calcite-file-excel实现查询excel内容,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-01-01
  • javaCV开发详解之收流器实现

    javaCV开发详解之收流器实现

    这篇文章主要介绍了javaCV开发详解之收流器实现,对javaCV有研究的同学,可以参考下
    2021-04-04
  • 使用Maven进行版本管理的详细步骤

    使用Maven进行版本管理的详细步骤

    aven提供了一套强大的版本管理机制,允许开发者管理项目的版本号,并在不同的版本之间进行升级和降级,以下是如何使用Maven进行版本管理的详细步骤和代码示例,感兴趣的小伙伴跟着小编一起来看看吧
    2024-11-11

最新评论