【问题标题】:Wrap transactions over existing transactional methods?将交易包装在现有的交易方法上?
【发布时间】:2014-01-30 08:10:44
【问题描述】:

如果我有一个在类级别上标记为@Transactional 的基本 Dao 类,这将导致 Dao 的每个调用都在它自己的事务中运行。

如果我在某处创建一个方法,该方法使用对不同 dao 方法的多次调用会怎样?这些调用中的每一个会在其自己的事务中运行,还是将事务包裹起来?

@Service
@Transactional
class BaseDao<T> {
    //each of these methods will run in a transaction
    public void save(T entity) { }
    public void update(T entity) { }
}

@Service
class PersonFacade() {
    //will this "wrapp" the transaction?
    @Transactional
    void update() {
        dao.find();
        dao.update();
    }
}

如果它被包装,您是否认为在通用 Dao 类上使用 @Transactional 注释是一个好习惯,以便可以直接将 dao 用作 @Autowired BaseDao&lt;Person&gt; 来管理 CRUD 操作?并且仅在需要时创建封装多个需要在单个事务中运行的 crud 调用的外观?

或者我应该更好地从基础 dao 中删除该事务?

【问题讨论】:

    标签: java spring


    【解决方案1】:

    如果您将两个调用都包装到一个也标记为@Transactional 的方法中,那么将只有一个事务可以跨越所有内容。

    我认为 DAO 类不应该有 @Transactional 注释。将它们放入提供“业务方法”的服务类中。只有那些会知道哪个 DAO 方法调用(可能来自多个实体)来组成有意义的事务。

    另见Where does the @Transactional annotation belong?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多