天天看點

spring boot 聲明式事務,在什麼情況下會失效

基于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);
    }
}
           

繼續閱讀