一、工具
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
/**
* 编程式事务处理
*/
public class TransactionalUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(TransactionalUtil.class);
/**
* 带传播特性的事务
*
* @param transactionDefinition {@link org.springframework.transaction.TransactionDefinition}
*/
public static void transact(PlatformTransactionManager transactionManager, int transactionDefinition, TransactionalHandler handler) {
DefaultTransactionDefinition transDef = new DefaultTransactionDefinition(); // 定义事务属性
transDef.setPropagationBehavior(transactionDefinition);
TransactionStatus status = transactionManager.getTransaction(transDef);
try {
handler.handle();
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
throw e;
}
}
public static void transact(PlatformTransactionManager transactionManager, TransactionalHandler handler) {
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
handler.handle();
transactionManager.commit(status);
} catch (Exception e) {
rollbackTransaction(transactionManager, status);
throw e;
}
}
private static void rollbackTransaction(PlatformTransactionManager transactionManager, TransactionStatus status) {
try {
transactionManager.rollback(status);
} catch (Exception rollbackException) {
// 增加对回滚操作的异常处理,仅记录异常,避免干扰主逻辑
LOGGER.error("事务回滚失败", rollbackException);
}
}
/**
* 事务sql执行器
*/
public interface TransactionalHandler {
/**
* 执行sql
*/
void handle();
}
}
二、使用
import com.config.TransactionalUtil;
import org.springframework.transaction.PlatformTransactionManager;
@Service
@Slf4j
public class TestService {
@Resource
private PlatformTransactionManager platformTransactionManager;
public void test(){
//编程式事务处理, 添加操作
TransactionalUtil.transact(platformTransactionManager, () -> projectBaseInfo.save(baseInfo));
//异步线程处理 编程式事务
CompletableFuture.runAsync(() ->
TransactionalUtil.transact(platformTransactionManager, () -> {
// 方法1人
service.init1();
// 初始化
service.init2();
}));
}
}