天天看點

Spring Boot - @Transactional 手動復原

案例介紹

@Service
@RequiredArgsConstructor
public class A () {
    private final UserService userService;

    public void login(UserInfo user) {
        UserInfo userInfo = userService.getByUsername(user.getUsername);
        if (userInfo == null) {
            userService.createUserInfo(userInfo);
        }

        int a = 1/0;
    }
}      
public interface UserInfoService {
    UserInfo getByUsername(String username);

    void createUserInfo(UserInfo userInfo);
}      

問題描述:程式運作時,1/0導緻異常,程式運作中斷。

解決方案

引入@Transactional

@Service
@RequiredArgsConstructor
public class UserInfoServiceImpl implements UserInfoService {
    private final UserInfoMapper userInfoMapper;

    @Override
    public UserInfo getByUsername(String username) {
        return userInfoMapper.selectByUsername(username);
    }

    @Override
    @Transactional
    public void createUserInfo(UserInfo userInfo) {
        userInfoMapper.insertUserInfo(userInfo);
    }
}      

設定手動復原

@Service
@RequiredArgsConstructor
public class A () {
    private final UserService userService;

    public void login(UserInfo user) {
        try {
            UserInfo userInfo = userService.getByUsername(user.getUsername);
            if (userInfo == null) {
                userService.createUserInfo(userInfo);
            }

            int a = 1/0;
        }  catch (Exception e) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
}