嵌套会话/事务中的交易中发生了什么



考虑这两个类别:opplyeedetaildaoimpl和homplyeeedaoimpl。假设如果我想创建一个新员工,我还应该为homployeedetail创建新记录。

给定以下实施情况,我想知道由于详细信息之后发生了任何例外,外部交易(homploeedaoimpl的TX)是否会退缩。P>

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(如下所示)来确保您的EJB和Spring Bean共享相同的交易。

如果您从pojo调用JPA方法,那么您将不得不照顾好自己处理的JTA交易。

是的,它也会回滚实体员工。它甚至不取决于其他实体是否相关。这取决于交易的范围,此处同时包括员工和iMhosheedetails

您正在为每种方法创建两个不同的交易。因此,回滚无法发生。

回滚交易,您需要交易中的促进。

您需要像下面的代码写下::

@Transactional(propagation=Propagation.REQUIRED)
public void testRequired(User user) {
  testDAO.insertUser(user);
  try{
    innerBean.testRequired();
  } catch(RuntimeException e){
    // handle exception
  }
}

以下是链接以获取更多促进信息。http://docs.spring.io/spring-framework/docs/2.5.6/api/org/springframework/transaction/annotation/annotation/propagation.html

http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial

相关内容

最新更新