通过现有的交易方法包裹交易?

时间:2014-01-30 08:10:44

标签: java spring

如果我在类级别上有一个标记为@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<Person>来管理CRUD操作吗?并且只有在需要时,创建包含需要在单个事务中运行的多个crud调用的外观?

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

1 个答案:

答案 0 :(得分:1)

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

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

另见Where does the @Transactional annotation belong?