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注解使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot 中该如何防御计时攻击

    Spring Boot 中该如何防御计时攻击

    这篇文章主要介绍了Spring Boot 中该如何防御计时攻击,帮助大家更好的使用spring boot框架,感兴趣的朋友可以了解下
    2020-09-09
  • Java多线程Condition接口原理介绍

    Java多线程Condition接口原理介绍

    这篇文章主要介绍了Java多线程Condition接口原理介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java使用snmp协议实现采集服务器信息

    Java使用snmp协议实现采集服务器信息

    SNMP是一种用于管理网络设备的协议,它是一种标准化的协议,被用于监控和管理网络设备,这篇文章主要介绍了Java如何使用snmp协议采集服务器信息,需要的可以参考下
    2024-12-12
  • SchedulingConfigurer实现动态定时,导致ApplicationRunner无效解决

    SchedulingConfigurer实现动态定时,导致ApplicationRunner无效解决

    这篇文章主要介绍了SchedulingConfigurer实现动态定时,导致ApplicationRunner无效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Spring Boot应用的极速部署脚本示例代码

    Spring Boot应用的极速部署脚本示例代码

    最近在工作中遇到了一个问题,需要极速的部署Spring Boot应用,发现网上这方面的资料较少,所以自己来总结下,这篇文章主要给大家介绍了关于Spring Boot应用的极速部署脚本的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • Java实现带图形界面的聊天程序

    Java实现带图形界面的聊天程序

    这篇文章主要为大家详细介绍了Java实现带图形界面的聊天程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • SpringBoot线程池配置使用示例详解

    SpringBoot线程池配置使用示例详解

    Spring Boot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统稳定性,本文给大家介绍SpringBoot线程池配置使用示例详解,感兴趣的朋友一起看看吧
    2025-07-07
  • 基于Java的电梯系统实现过程

    基于Java的电梯系统实现过程

    这篇文章主要介绍了基于Java的电梯系统实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • SpringBoot+Vue实现EasyPOI导入导出的方法详解

    SpringBoot+Vue实现EasyPOI导入导出的方法详解

    项目开发过程中,很大的需求都有 导入导出功能。本文将利用SpringBoot+Vue实现EasyPOI导入导出功能,感兴趣的可以了解一下
    2022-08-08
  • Java数据封装树形结构代码实例

    Java数据封装树形结构代码实例

    这篇文章主要介绍了Java数据封装树形结构代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01

最新评论