2012-06-14 108 views
0

我有3个EJB无状态bean。 A - 业务层。 B,C - 持久层。EJB 3.1事务传播

Bean A调用B和C来更新数据库(DB2)中的某些数据。

但不幸的是,在调用bean C时数据库锁。 B和C可能在不同的交易中执行吗?否则我不明白为什么DB2锁定...

回答

0

如果您使用hibernate作为持久性提供程序,那么它会在业务方法上提供名为@TransactionAttribute(REQUIRES_NEW)的事务注释。此注释在单独的事务中运行该方法。所以我认为JPA应该有一个替代方案。但不确定。

+0

所以,如果我没有把这个注释放在商业方法上,那么就不会开始交易。 B和C单独交易? – obogoliy

+0

如果不放这个注解,那么该方法将在父事务中运行,即如果调用此方法的父方法完成,事务将完成。而且我假设你正在从B中调用B和C中的方法,所以直到A完成B和C将在同一事务中运行 –

+0

如果不是机密,你也可以发布你的代码吗? –

0

我有JBoss AS 7. 我有两个实体Employer和EMployee。员工与雇主有联系。

@Stateless 
EployerService { 
.... 
public void lockEmployer (long id) { 
    Employer employer = employerDAO.findById(id); 
    employer.setLocked(true); 
    employerDAO.updateEmployer(employer); 
    employeeDAO.updateEmployeesByEmployerId(id); 
} 
} 

在EmployeeDAO

updateEmployeesByEmployerId (long empId) { 
    em.createQuery("update Employee set locked = true where emplopyerId=:id").setParameter("id", empId).executeUpdate(); 

} 

在EmployerDAO

udpateEmplopyer(Employer employer) { 
    em.merge(employer); 
} 

当我把所有的逻辑来自贾岛一个DAO - 没有锁!