Java事务管理

本文详细介绍了Spring框架中的@Transactional注解在事务管理中的应用,包括其限制(如只作用于public方法,回滚特定异常类型),以及事务传播行为(REQUIRED和REQUIRED_NEW的区别)。
摘要由CSDN通过智能技术生成

@Tranasctional注解是Spring 框架提供的声明式注解事务解决方案,我们在开发中使用事务保证方法对数据库操作的原子性,要么全部成功,要么全部失败,在使用@Transactional注解时需要注意以下问题:
1.@Transactional 注解只能用在public 方法上,如果用在protected或者private的方法上,不会报错,但是该注解不会生效。
2. @Transactional注解只能回滚非检查型异常,具体为RuntimeException及其子类和Error子类,可以从Spring源码的DefaultTransactionAttribute类里找到判断方法rollbackOn。

@Override
public boolean rollbackOn(Throwable ex) {
	return (ex instanceof RuntimeException || ex instanceof Error);
}
  1. 使用rollbackFor 属性来定义回滚的异常类型,使用 propagation 属性定义事务的传播行为。
  2. @Transactional注解不能回滚被try{}catch() 捕获的异常。

默认回滚RuntimeException和Error,如果要回滚其他异常要记得配置rollbackFor

	//Spring事务管理
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void deleteById(Integer id) {
        try{
            deptMapper.deleteById(id);
            int a=1/0;
            empMapper.deleteById(id);
        }finally {
            //另一个事务
            insert();
        }

    }

事务传播行为主要有两种,REQUIRED(默认)和REQUIRED_NEW;
REQUIRED行为是加入事务操作,比如deleteById开启了一个事务但是遇到异常,遇到另一个事务insert会加入到当前事务,所以程序中只有一个事务,会同时回滚。
REQUIRED_NEW遇到insert事务会开启一个新的事务,可以避免同时回滚。

	//Spring事务管理
    @Transactional
    @Override
    public void deleteById(Integer id) {
        try{
            deptMapper.deleteById(id);
            int a=1/0;
            empMapper.deleteById(id);
        }finally {
            //另一个事务
            insert();
        }

    }
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void insert(){
    ;;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值