2012-06-14 89 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 - 沒有鎖!