开发者

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

目录
  • @Transactional
  • @GlobalTransactional
  • 总结
  • 附:@GlobalTransactional回滚失效

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

@Transactional

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

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

使用步骤:

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

    @Tr编程客栈ansactional
    public void performDatabaseoperations() {
        // 在这里执行数据库操作
    }
}

@GlobalTransactional

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

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

使用步骤:

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

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

总结

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

附:@GlobaphplTransactional回滚失效

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

问题所在:

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

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

解决:

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

到此这篇关于Java事务@Transactional 、@GlobalTransactional使用步骤的文章就介绍到这了,更多相关Java事务@Transactional 、@GlobalTransactional内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新开发

开发排行榜