事务回滚

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_35809876/article/details/80860236

spring 事务必须知道的内容。

spring事务处理在spring注解事务便捷了我们对事务的管理。如果我们不清楚注解事务的运行原理,那么会给我们带来一些困扰

下面的我要记录的就是在注解使用中的一些问题点。

在一个service中内部调用。class 里面有方法A 和方法B 都开启了事务注解。并且方法B 申明了不与其他事务合并作为一个单独事务。 如下图 案例

1)事务在一个service中内部调用,如下图所示

事务生效,但是方法B 的事务没有单独在开启一个事务。原因类似于是因为 spring aop 代理因为声明式事务 是通过代理类做的事务管理。下图是模拟大概的意思

方法B 不是通过代理类调用,而是自身的调用。所以事务不生效

案例2

在service方法上开启事务注解,并在方法前使用synchronized 关键字。我们想要达到的效果是在执行这个方法事务前进行加锁操作。在实际使用中发现,我的们锁并没有实际生效。其原理也可以参照上图。

事务注解 AOP 先开启事务,在执行方法。而锁是在执行方法时进行,这样整个过程就是 事务包裹着锁。而不是我们想要的锁包裹着事务。

手動回滾事務操作

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

代碼層次的事務回滾操作

//代码级别的事务控制
transactionTemplate.execute( new TransactionCallbackWithoutResult(){

    @Override
    protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
        try{
            // TODO  do something service  必须是mybatis 的异常
            MonitorLog m = new MonitorLog(  );
            m.setAppName( "aaaa" );
            monitorLogDao.insert( m );
            MonitorLog userMongo = monitorLogDao.selectOne( m );
            if(null != userMongo){
                ArrayIndexOutOfBoundsException  exception = new ArrayIndexOutOfBoundsException("数组越界异常!!!!");
                throw exception;
            }
        }catch (Exception e){
            //如果抛出异常择回滚操作
            transactionStatus.setRollbackOnly();
            e.printStackTrace(  );
            logger.error( "ssssssssssssss异常" );
        }
    }
} );
使用Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint(); 

设置回滚点,使用TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);

回滚到savePoint。

简版

猜你喜欢

转载自blog.csdn.net/qq_35809876/article/details/80860236
今日推荐