声明式事务直接使用@Transactional注解即可,简单、快捷、方便,但@Transactional声明式事务的可控性太弱了,只可在方法或类上声明,做不到细粒度的事务控制。并且存在aop失效等问题
此类情况可使用编程式事务进行控制
主要引用到类 TransactionTemplate
使用实例如下
- 工具封装
package cn.ygkj.warnservice.component;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.transaction.support.TransactionTemplate;
import java.util.function.Consumer;
/**
* 编程式事务工具
* @author lei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class TransactionServer {
private final TransactionTemplate transactionTemplate;
/**
* 编程式事务管理器
* @param f
* @return java.lang.Boolean
* @author lei
*/
public <T> Boolean execute(Consumer<T> f){
return transactionTemplate.execute(state -> {
try {
f.accept(null);
return true;
} catch (Exception e) {
log.error("编程式事务异常,开始回滚");
state.setRollbackOnly();
return false;
}
});
}
}
- 使用实例
package cn.ygkj.warnservice.component;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
/**
* @author lei
* @date 2022-12-29 11:27
*/
@Service
@RequiredArgsConstructor
public class TranscationalDemo {
private final TransactionServer transactionServer;
public Boolean saveSuccess() {
return Boolean.TRUE;
}
public Boolean saveFail() {
throw new IllegalArgumentException("there is some illegalArg error");
}
public Boolean save() {
return transactionServer.execute(state -> {
//将事务操作编写在此处
saveSuccess();
saveFail();
});
}
}