java - 将交易包装在现有的交易方法之上?

标签 java spring

如果我有一个基本的 Dao 类,标记为 @Transactional在类级别,这将导致 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();
    }
}

如果它被包装,您会认为拥有 @Transactional 是一个很好的做法吗?通用 Dao 类上的注释,以便 dao 可以直接用作 @Autowired BaseDao<Person>管理 CRUD 操作?并且仅在需要时创建外观来包装需要在单个事务中运行的多个 CRUD 调用?

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

最佳答案

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

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

另请参阅Where does the @Transactional annotation belong?

关于java - 将交易包装在现有的交易方法之上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21450926/

相关文章:

java - 如何将经过身份验证的用户名保存到数据库中

java - 如何从容器内连接zabbix api?

java - Jersey 使用 POST 接受文件参数和字符串

java - 在 GWT 中模仿 jQuery event.which

java - 在 hibernate 中使用带有条件的联接和子查询

java - Tomcat 8 和 Spring Security Cors

java - 如何 Autowiring Spring TaskExecutor 创建的线程?

java - 将 XML 文本转换为许多不同的类

spring - IoC和AOP是什么关系?

java - 在 Spring 中通过代理创建和初始化惰性类实例