当前位置: 代码网 > it编程>编程语言>Java > 通过Spring层面进行事务回滚的实现

通过Spring层面进行事务回滚的实现

2025年04月14日 Java 我要评论
spring 中事务可以分为声明式事务和编程式事务,那么解下来就从这两方面说一说在 spring 层面个怎么进行回滚声明式事务回滚:1. 基础注解配置通过@transactional注解实现自动回滚,

spring 中事务可以分为声明式事务和编程式事务,那么解下来就从这两方面说一说在 spring 层面个怎么进行回滚

声明式事务回滚:

1. 基础注解配置

通过@transactional注解实现自动回滚,默认对runtimeexception和error生效

@transactional
public void transfermoney(account from, account to, double amount) {
    from.withdraw(amount);  // 扣款
    to.deposit(amount);     // 存款
    // 若在此处抛出runtimeexception,事务自动回滚
}

2. 指定回滚异常类型

可以通过 @transactional 注解的 rollbackfor 参数扩展回滚范围到受检异常

@transactional(rollbackfor = {sqlexception.class, businessexception.class})
public void processorder(order order) throws customexception {
    // 抛出sqlexception或businessexception时回滚
}

需要显示声明受检查异常类型,否则不会滚

3. ​不回滚特殊场景

使用 norollbackfor 参数排除特定异常

@transactional(norollbackfor = {validationexception.class})
public void validatedata(data data) {
    // validationexception不会触发回滚
}

编程式事务回滚:

1. ​使用 transactiontemplate 实现编程式事务

@autowired
private transactiontemplate transactiontemplate;

public void batchprocess() {
    transactiontemplate.execute(status -> {
        try {
            // 业务操作...
            if (errorcondition) status.setrollbackonly();
            return result;
        } catch (exception e) {
            status.setrollbackonly();
            throw e;
        }
    });
}

2. 使用 ​platformtransactionmanager 实现编程式事务

直接操作事务管理器实现完全控制

@autowired
private platformtransactionmanager transactionmanager;

public void complexoperation() {
    transactionstatus status = transactionmanager.gettransaction(new defaulttransactiondefinition());
    try {
        // 业务操作...
        transactionmanager.commit(status);
    } catch (exception e) {
        transactionmanager.rollback(status);
        throw new serviceexception("操作失败", e);
    }
}

嵌套事务与传播行为相关的异常回滚:

1. 嵌套事务(propagation_nested)

子事务作为父事务的保存点,可部分回滚

@transactional(propagation = propagation.required)
public void parentmethod() {
    // 主业务逻辑
    childmethod();  // 嵌套子事务
}

@transactional(propagation = propagation.nested)
public void childmethod() {
    // 子事务操作,失败仅回滚子操作
}

2.传播行为控制

通过传播策略控制事务边界:
requires_new:始终新建事务
mandatory:必须存在父事务
not_supported:非事务执行

通过 xml 的方式配置全局回滚规则:

<tx:advice id="txadvice">
    <tx:attributes>
        <tx:method name="save*" rollback-for="java.lang.exception"/>
        <tx:method name="update*" no-rollback-for="businesswarning"/>
    </tx:attributes>
</tx:advice>

到此这篇关于通过spring层面进行事务回滚的实现的文章就介绍到这了,更多相关spring事务回滚内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com