gpt4 book ai didi

java - 嵌套 session /事务中的 Transaction.rollback 会发生什么?

转载 作者:行者123 更新时间:2023-12-02 13:40:08 25 4
gpt4 key购买 nike

考虑这两个类:EmployeeDetailDAOImpl 和 EmployeeDAOImpl。假设如果我想创建一个新员工,我还应该为 EmployeeDetail 创建一条新记录。

考虑到下面的实现,我想知道如果在detailDAO.create(employeeId)调用后发生任何异常,外部事务(EmployeeDAOImpl的tx)被回滚,那么new EmployeeDetail的事务也会被回滚吗?

public class SessionHandler {
public static getSession() {
return Configuration.buildSessionFactory().openSession(); //ignore the isConnected or other exception handling for now
}
}

public class EmployeeDetailDAOImpl {
public void create(Serializable employeeId) {
Session session = SessionHandler().getSession();
Transaction tx = session.beginTransaction();
try {
EmployeeDetail detail = new EmployeeDetail(employeeId);
session.save(detail );
} catch (Exception e) {
if (tx!= null) {
tx.rollback;
}
}
session.close();
}
}

public class EmployeeDAOImpl {
public void add(String name) {
Session session = SessionHandler().getSession();
Transaction tx = session.beginTransaction();
try {
Employee employee = new Employee(name);
Serializable employeeId= session.save(employee);
EmployeeDetailDAOImpl detailDAO = new EmployeeDetailDAOImpl();
detailDAO.create(employeeId);
//more things here, that may through exceptions.
} catch (Exception e) {
if (tx!= null) {
tx.rollback;
}
}
session.close();
}
}

最佳答案

实际上,给出的答案都不是 100% 正确的。

这取决于调用方/服务。

如果您从 EJB 调用方法,则将有 1 个事务涵盖这两个方法调用。这样,如果发生异常,事务将回滚这两个操作。这背后的原因是 EJB 中的每个方法都是事务必需的,除非在注释或 ejb 部署描述符中另有指定。

如果您使用 spring 或任何其他 DI 框架,那么这取决于您的配置。在正常设置中,您的调用事务将被挂起,因为 JPA EJB 将创建自己的事务。不过,您可以使用 JTATransactionManager ( As specified here ) 来确保您的 EJB 和 Spring bean 共享相同的事务。

如果您从 POJO 调用 JPA 方法,那么您必须自己处理 JTA 事务。

关于java - 嵌套 session /事务中的 Transaction.rollback 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42779540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com