案例介绍
@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会捕获异常,同时回滚插入操作。