Java事务@Transactional 、@GlobalTransactional使用步骤

 更新时间:2025年05月07日 09:03:59   作者:快乐吃手手 : )  
这篇文章主要介绍了使用@Transactional和@GlobalTransactional注解进行事务管理的区别和应用场景,@Transactional用于单个服务内的本地事务管理,而@GlobalTransactional用于跨服务的分布式事务管理,文中给出了详细的代码示例,需要的朋友可以参考下

在微服务系统中,@Transactional 和 @GlobalTransactional 注解用于管理事务,但它们的应用场景和作用范围有所不同。

@Transactional

@Transactional 是 Spring 框架提供的一个注解,用来标记需要事务管理的方法。当方法被标注为 @Transactional 时,Spring 会为其创建一个事务。如果方法执行过程中发生异常,则事务会被回滚。这个注解通常用于单个服务内的数据库操作,确保这些操作要么全部成功,要么全部不执行(回滚)。它适用于以下情况:

  • 当你需要保证单个服务内部的一系列数据库操作的原子性时。
  • 在单个服务内,你希望对某些方法进行事务管理,以便在出现错误时能够回滚所做的更改。

使用步骤:

  • 引入依赖:首先确保你的项目中已经包含了Spring的相关依赖。
  • 开启事务管理:在Spring Boot应用中,可以通过在主类或配置类上添加@EnableTransactionManagement注解来启用事务管理功能。如果你使用的是Spring Boot,默认情况下这个是自动配置好的。
  • 标记方法:使用@Transactional注解直接标注在需要事务管理的方法上,或者标注在整个类上使该类的所有公共方法都默认具有事务性。
public class ServiceClass {

    @Transactional
    public void performDatabaseOperations() {
        // 在这里执行数据库操作
    }
}

@GlobalTransactional

@GlobalTransactional 一般出现在分布式事务管理框架中,比如阿里巴巴的 Seata。Seata 提供了 AT、TCC、Saga 和 XA 模式来解决分布式事务问题。@GlobalTransactional 注解用于标识一个全局事务,它跨越多个服务或资源,确保整个业务流程中的所有操作要么全部提交,要么全部回滚。这在以下场景中特别有用:

  • 当你的业务逻辑涉及到多个微服务之间的调用,并且需要这些服务的操作具有事务一致性时。
  • 当你需要处理跨数据库或跨服务的分布式事务时,以确保数据的一致性和完整性。

使用步骤:

  • 引入Seata依赖:确保你的项目中包含Seata客户端的依赖。
  • 配置Seata:根据Seata的文档配置Seata服务端和客户端。这包括注册中心、配置中心等的设置。
  • 开启全局事务支持:在你的Spring Boot应用中,通常无需额外注解开启全局事务支持,但需确保Seata配置正确。
  • 标记方法:使用@GlobalTransactional注解来标记需要进行分布式事务控制的方法
public class DistributedService {

    @GlobalTransactional
    public void performDistributedTransaction() {
        // 执行跨服务的业务逻辑
    }
}

总结

  • 使用 @Transactional 来管理单个服务内的本地事务。
  • 使用 @GlobalTransactional 来管理涉及多个服务或资源的分布式事务,确保跨服务调用之间的一致性。
  • 异常处理:默认情况下只有遇到运行时异常和错误时才会触发回滚。可以通过属性rollbackFor指定其他类型的异常也触发回滚。
  • 传播行为:可以使用propagation属性定义事务的传播行为,比如是否在一个已存在的事务中运行还是创建新的事务。
  • 隔离级别:通过isolation属性设定事务的隔离级别。

附:@GlobalTransactional回滚失效

问题: @GlobalTransactional和mapstruct转换器同时使用有时候不会回滚,但是GlobalTransactional日志输出的是回滚成功,但是数据库的数据还是生成了或者是改变了。

问题所在:

 这里是mapstruct转换器所生成的代码,目标id类型是long,数据源是int,在回滚时GlobalTransactional不会去识别类型不同的字段 所以回滚失败。

解决:

只需要同名字段类型相同即可回滚成功。

到此这篇关于Java事务@Transactional 、@GlobalTransactional使用步骤的文章就介绍到这了,更多相关Java事务@Transactional 、@GlobalTransactional内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Maven项目中读取src/main/resources目录下的配置文件的方法

    Maven项目中读取src/main/resources目录下的配置文件的方法

    本篇文章主要介绍了Maven项目中读取src/main/resources目录下的配置文件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • IntelliJ IDEA(2019)安装破解及HelloWorld案例(图文)

    IntelliJ IDEA(2019)安装破解及HelloWorld案例(图文)

    这篇文章主要介绍了IntelliJ IDEA(2019)安装破解及HelloWorld案例(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • java抛出异常后,后续代码是否继续执行详解

    java抛出异常后,后续代码是否继续执行详解

    这篇文章主要给大家介绍了关于java抛出异常后,后续代码是否继续执行详的相关资料,在Java编程中,异常是当程序执行时遇到问题时抛出的一种特殊情况,需要的朋友可以参考下
    2023-07-07
  • java判断Long类型的方法和实例代码

    java判断Long类型的方法和实例代码

    在本篇文章里小编给大家整理的是关于java判断Long类型的方法和实例代码,对此有需要的朋友们跟着学习参考下。
    2020-02-02
  • Java通过SSH连接路由器输入命令并读取响应的操作方法

    Java通过SSH连接路由器输入命令并读取响应的操作方法

    最近需要读取和修改华为路由器的配置,使用Java语言开发,通过SSH连接,输入命令并读取响应,接下来通过本文给大家介绍下Java通过SSH连接路由器,输入命令并读取响应,需要的朋友可以参考下
    2024-01-01
  • Java函数式编程(十二):监控文件修改

    Java函数式编程(十二):监控文件修改

    这篇文章主要介绍了Java函数式编程(十二):监控文件修改,本文是系列文章的第12篇,其它文章请参阅本文底部的相关文章,需要的朋友可以参考下
    2014-09-09
  • Feign调用传输文件异常的解决

    Feign调用传输文件异常的解决

    这篇文章主要介绍了Feign调用传输文件异常的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • hibernate查询缓存详细分析

    hibernate查询缓存详细分析

    这篇文章主要介绍了hibernate查询缓存详细分析,包括查询缓存配置方法及关闭二级缓存的详细介绍,需要的朋友参考下本文吧
    2017-09-09
  • java多线程解决生产者消费者问题

    java多线程解决生产者消费者问题

    这篇文章主要介绍了java多线程解决生产者消费者问题的方法,实例分析了java采用多线程的方法解决生产者消费者问题的相关技巧,需要的朋友可以参考下
    2015-05-05
  • java线程中断 interrupt 和 LockSupport解析

    java线程中断 interrupt 和 LockSupport解析

    这篇文章主要为大家介绍了java线程中断 interrupt 和 LockSupport示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02

最新评论