0
点赞
收藏
分享

微信扫一扫

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导致异常,程序运行中断。

期望结果:数据库无法成功插入user。

实际结果:数据库可以成功插入user。

解决方案

引入@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();
}
}
}

发生异常时,try/catch会捕获异常,同时回滚插入操作。

举报

相关推荐

0 条评论