注解式事务的不足
当方法执行的时间过长,方法里的某些操作并不需要被包括在事务内的时候,用 @Transactional 就不太好了。因为事务一直得不到提交或回滚会一直占用连接。
编程式事务
@Autowired
private TransactionTemplate transactionTemplate;
public void method() {
Integer execute = transactionTemplate.execute(status -> {
//业务代码
});
if (execute == 0) {
//如果执行不成功,可以继续调 method()
//method();
}
}
跟源码
@Override
@Nullable
public <T> T execute(TransactionCallback<T> action) throws TransactionException {
Assert.state(this.transactionManager != null, "No PlatformTransactionManager set");
if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) {
return ((CallbackPreferringPlatformTransactionManager) this.transactionManager).execute(this, action);
}
else {
//开启事务,见4.1
TransactionStatus status = this.transactionManager.getTransaction(this);
T result;
try {
//调匿名类里的方法 excute(status->{})
result = action.doInTransaction(status);
}
catch (RuntimeException | Error ex) {
// Transactional code threw application exception -> rollback
//回滚
rollbackOnException(status, ex);
throw ex;
}
catch (Throwable ex) {
// Transactional code threw unexpected exception -> rollback
rollbackOnException(status, ex);
throw new UndeclaredThrowableException(ex, "TransactionCallback threw undeclared checked exception");
}
//提交
this.transactionManager.commit(status);
return result;
}
}
本文探讨了注解式事务在方法执行时间过长时的局限性,及编程式事务通过TransactionTemplate提供的更灵活的事务管理方式,深入解析其源码执行流程。
929

被折叠的 条评论
为什么被折叠?



