java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java事务@Transactional 、@GlobalTransactional

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

作者:快乐吃手手 : )

这篇文章主要介绍了使用@Transactional和@GlobalTransactional注解进行事务管理的区别和应用场景,@Transactional用于单个服务内的本地事务管理,而@GlobalTransactional用于跨服务的分布式事务管理,文中给出了详细的代码示例,需要的朋友可以参考下

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

@Transactional

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

使用步骤:

public class ServiceClass {

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

@GlobalTransactional

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

使用步骤:

public class DistributedService {

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

总结

附:@GlobalTransactional回滚失效

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

问题所在:

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

解决:

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

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

您可能感兴趣的文章:
阅读全文