spring @Transactional方法调用同一个类中的方法

jvlzgdj9  于 2023-06-21  发布在  Spring
关注(0)|答案(1)|浏览(191)

我有一个类UserService,它有一个方法saveUser()和saveAmount(),如下所示。

class UserService {
    
    @Transactional
    public void saveUsers() {
        saveUser1 to db;
        saveUser2 to db;
        saveAmount();
        saveUser3 to db;
    }
    
    public void saveAmount() {
        saveAmount1 to db;
        saveAmount2 to db // throws exception
        saveAmount3 to db;
    }
}

根据Spring AOP,当调用saveAmount()时,代理不会被触发,并且我们有saveUsers方法的相同事务继续saveAmount,因此saveAmount中的任何异常(例如在方法的第2行)如果发生将回滚saveUser1到db和saveUser2到db。
问:saveAmount1到db是否也会回滚?
我试着在我的本地机器上复制这个,我希望saveAmount1到db不会回滚,因为它是从同一个对象调用的,AOP没有启动。

zzoitvuj

zzoitvuj1#

如果你自己调用一个@Transactional方法,AOP不会踢它,这只意味着正在被自己调用的方法上的@Transactional不会有任何效果。
但是现在saveAmount()上没有任何@Transactional注解,所以这与AOP是否会启动无关。
在这种情况下,saveUsers()saveAmount()都在同一个事务中执行。同一事务中的所有代码都有全有或全无的行为,这意味着对DB的更改要么全部成功,要么全部失败。所有失败也意味着任何抛出异常的代码将回滚所有成功执行的数据库更改。因此,如果saveAmount2抛出异常,则每个DB更改都将回滚,包括saveAmount1。

相关问题