zl程序教程

您现在的位置是:首页 >  后端

当前栏目

spring事务回滚机制_事务回滚失败

Spring事务 机制 失败 回滚
2023-06-13 09:14:23 时间

Spring事务回滚

使用 @Transaction 来配置自动回滚,可以配置在类上,也可以配置在方法上(作用域不同),但对final或private修饰的方法无效,且该类必须是受spring所管控的。

@Service
@Transactional
public class UserServiceImpl implements UserService { 
     
    @Override
    public void save(User user) { 
     
        //some code
        //db operation
    }
}

Jetbrains全家桶1年46,售后保障稳定

若被配置的方法或类抛出了异常,则事务会被自动回滚,除非你在该方法中手动捕获了异常。可以使用 @Transactional(rollbackFor = Exception.class) 来设定针对特定的异常进行事务回滚,如果不设置则默认会回滚 RuntimeException and Error (参考自源码内文档)。

@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService { 
     
    @Resource
	private UserMapper userMapper;
    
    @Override
    public void save(User user) { 
     
        userMapper.insert(user);
        throw new RuntimeException(); // 抛出异常,事务回滚,上面的insert插入失败。
    }
}

通过注入 DataSourceTransactionManager 来手动开启事务,手动回滚事务,用于抛出异常被catch后,进行手动回滚。

@Service
public class UserServiceImpl implements UserService { 

@Autowired
private DataSourceTransactionManager transactionManager;
@Override
@Transactional
public void save(User user) { 

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
// explicitly setting the transaction name is something that can only be done programmatically
def.setName("SomeTxName");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManager.getTransaction(def);
try { 

// execute your business logic here
//db operation
} catch (Exception ex) { 

transactionManager.rollback(status);
throw ex;
}
}
} // 此代码案例来自Alibaba Coding Guidelines

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

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179398.html原文链接:https://javaforall.cn