java jpa 事务管理

数据库(Mysql)异常(MySQLIntegrityConstraintViolationException:jpa save方法设置了某个字段不可为空)


1.catch处理异常: 回滚生效 报错javax.persistence.RollbackException: Transaction marked as rollbackOnly  

猜测是因为:save方法的时候,事务已经被标记成回滚的状态了(rollback-only),且不能再设置为不回滚,在外层事务 try catch处理了异常,没有捕捉到异常,提交的时候是正常提交,不回滚的状态,可是save和外侧是同一个事务,回滚状态不一致,所以报错。

@Transactional(rollbackFor = Exception.class)
    public String testTransactional(){
        try{
            dataJpa.save(new Data("test","test","test","test"));
            doorCardJpa.save(new DoorCard("test","test",null));
        }catch (Exception e){
            //手动回滚
            //TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            //throw  e;
        }
        return "";
    }

2.catch抛出异常:回滚生效 报错
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'add_time' cannot be null

@Transactional(rollbackFor = Exception.class)
    public String testTransactional(){
        try{
            dataJpa.save(new Data("test","test","test","test"));
            doorCardJpa.save(new DoorCard("test","test",null));
        }catch (Exception e){
            //手动回滚
            //TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            throw  e;
        }
        return "";
    }

3.catch手动回滚事务: 回滚生效 不报错
//手动回滚代码
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

@Transactional(rollbackFor = Exception.class)
    public String testTransactional(){
        try{
            dataJpa.save(new Data("test","test","test","test"));
            doorCardJpa.save(new DoorCard("test","test",null));
        }catch (Exception e){
            //手动回滚
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//            throw  e;
        }
        return "";
    }

 

程序异常:(java.lang.ArithmeticException: / by zero)
1.catch处理: 不回滚

@Transactional(rollbackFor = Exception.class)
    public String testTransactional(){
        try{
            dataJpa.save(new Data("test","test","test","test"));
            doorCardJpa.save(new DoorCard("test","test","test"));
            int i = 1/0;
        }catch (Exception e){
            //手动回滚
            //TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            //throw  e;
        }
        return "";
    }


2.catch抛出异常:回滚生效 报错(正常故意报的错)
java.lang.ArithmeticException: / by zero

@Transactional(rollbackFor = Exception.class)
    public String testTransactional(){
        try{
            dataJpa.save(new Data("test","test","test","test"));
            doorCardJpa.save(new DoorCard("test","test","test"));
            int i = 1/0;
        }catch (Exception e){
            //手动回滚
            //TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            throw  e;
        }
        return "";
    }

3.catch手动回滚事务: 回滚生效 不报错

//手动回滚代码
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

@Transactional(rollbackFor = Exception.class)
    public String testTransactional(){
        try{
            dataJpa.save(new Data("test","test","test","test"));
            doorCardJpa.save(new DoorCard("test","test","test"));
            int i = 1/0;
        }catch (Exception e){
            //手动回滚
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            //throw  e;
        }
        return "";
    }

所以在事务中使用try catch 最好在catch中手动回滚:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

throw异常的话,throw后边的代码不会被执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SL_Home

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值