0

我目前正在使用 Hibernate 作为持久性管理器和 JPA 作为持久性管理休眠的抽象在 java 中开发应用程序。

我想知道围绕事务包装结果查询的影响。我知道实体管理器必须为延迟获取的字段错误保持打开状态,这一切中的事务呢?

这是一个具有事务激活/停用能力的代码示例。

public List<Exportdata> get(Integer max, EntityManager em, Boolean withTransaction) {
    EntityTransaction tx = null;
    try {
        if (withTransaction) {
            tx = em.getTransaction();
            tx.begin();
        }

        Query query = em.createQuery("from Exportdata");
        query.setMaxResults(10);
        List<Exportdata> list = query.getResultList();

        if (withTransaction)
            tx.commit();

        return list;
    } catch (RuntimeException re) {
        if (withTransaction)
            if (tx != null && tx.isActive())
                tx.rollback();

        throw re;
    }
}

调用此函数时启用或禁用 withTransaction 有什么区别?

谢谢大家,弗雷德

4

1 回答 1

5

这里没有实际区别,因为您没有更改任何数据。您执行的查询将生成一个 SQL 选择。事务允许您将 ACID 属性应用于插入、更新等的集合。

但是,如果您开始操作从此方法返回的列表中的对象、调用 setter 等,这些更改将通过临时事务传播回数据库。换句话说,您将有效地在自动提交模式下使用数据库。这不太可能是您想要的。

要理解的重要一点是,持久性上下文和事务的持续时间可以分开管理。通常,尽管您希望将它们一起管理。

于 2008-10-29T10:44:12.550 回答