【问题标题】:About the use of @Transactional关于@Transactional 的使用
【发布时间】:2021-10-28 21:15:06
【问题描述】:

我有一个方法可以更新两个表(table A 和table B)。我希望整个事务是原子的,这样如果更新table A 失败(数据库更新失败,或者在进行实际数据库调用之前代码抛出异常),那么它将不会更新table B 以保留数据一致性。我的问题:

  1. 我想用@Transactional注解来做,这个用法对吗?

  2. 我已经看到一些将@Transactional 放在类级别和方法级别,如果我只放在方法级别,它仍然有效吗?

  3. 假设如下。如果我只将@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);
}

【问题讨论】:

标签: java spring


【解决方案1】:
  1. 是的,@Transactional 适合这个。
  2. 是的,@Transactional 也适用于方法级别,但有一个问题,我将在以下主题中讨论(这也适用于类级别的 @Transactional)。
  3. 假设您的代码不起作用,原因是 Spring 提供事务功能的方式。它基于 Spring AOP 和 bean 的代理。事务功能由这个代理处理,但问题是只有从另一个 bean 到您的 bean 的调用通过这个代理。这意味着同一 bean 中的方法之间的调用不通过代理,因此不提供事务功能。话虽如此,除非您将 @Transactional 添加到您的公共 updateMethod 方法并从另一个 bean 调用它,否则您的代码将无法按预期工作。

检查您的问题的 cmets,那里有一些有用的链接。

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 2011-01-22
    • 2016-05-29
    相关资源
    最近更新 更多