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