【发布时间】:2021-10-28 21:15:06
【问题描述】:
我有一个方法可以更新两个表(table A 和table B)。我希望整个事务是原子的,这样如果更新table A 失败(数据库更新失败,或者在进行实际数据库调用之前代码抛出异常),那么它将不会更新table B 以保留数据一致性。我的问题:
-
我想用
@Transactional注解来做,这个用法对吗? -
我已经看到一些将
@Transactional放在类级别和方法级别,如果我只放在方法级别,它仍然有效吗? -
假设如下。如果我只将
@Transactional放在updateValue的私有方法中,是否意味着只有来自tableADao.updateValue(value)和tableBDao.updateValue(value)(而不是tableADao.get(userId))的更新操作将被包装在一个事务中?
public void updateMethod(final Long userId, Integer value) {
//some processing
Integer value = tableADao.get(userId);
//some processing
updateValue(value);
//some processing
}
@Transactional
private void updateValue(final Integer value) {
tableADao.updateValue(value);
tableBDao.updateValue(value);
}
【问题讨论】:
-
您对
@Transactional的理解似乎是正确的。您可能还想将@Modifying添加到方法中。 -
有关“私有方法上的@Transaction”主题,请参阅stackoverflow.com/questions/4396284/…