0
点赞
收藏
分享

微信扫一扫

springboot中编程式事务使用

声明式事务直接使用@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();
});
}

}


举报

相关推荐

0 条评论