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事务回滚内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论