基于spring boot來驗證事務在什麼情況下會失效
首先要明确spring的事務是基于動态代理來實作的
1.如果聲明事務的方法不是public,那麼事務會失效
2.當一個沒有事務的方法,調用一個有事務的方法時,會讓事務失效
例如以下代碼
如果直接調用service層的save方法,那麼事務會生效,因為service層使用聲明了事務注解,
但是如果通過service層的沒有事務的add方法,來調用有事務的save方法,那麼此時就是通過this來調用的,将不會産生代理對象,是以事務就不會生效,user插入成功後,雖然顯式的抛出異常,那麼插入成功的資料也不會復原;
在這種情況下,如果想要使add的方法添加事務,在其方法上聲明事務注解即可
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Override
@Transactional
public int save(User user) {
int total = userMapper.insert(user);
if (total == 1) {
throw new RuntimeException("rollback");
}
return total;
}
@Override
public int add(User user) {
return save(user);
}
}