版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
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。
简版