我有3個EJB無狀態bean。 A - 業務層。 B,C - 持久層。EJB 3.1事務傳播
Bean A調用B和C來更新數據庫(DB2)中的某些數據。
但不幸的是,在調用bean C時數據庫鎖。 B和C可能在不同的交易中執行嗎?否則我不明白爲什麼DB2鎖定...
我有3個EJB無狀態bean。 A - 業務層。 B,C - 持久層。EJB 3.1事務傳播
Bean A調用B和C來更新數據庫(DB2)中的某些數據。
但不幸的是,在調用bean C時數據庫鎖。 B和C可能在不同的交易中執行嗎?否則我不明白爲什麼DB2鎖定...
如果您使用hibernate作爲持久性提供程序,那麼它會在業務方法上提供名爲@TransactionAttribute(REQUIRES_NEW)
的事務註釋。此註釋在單獨的事務中運行該方法。所以我認爲JPA應該有一個替代方案。但不確定。
我有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 - 沒有鎖!
所以,如果我沒有把這個註釋放在商業方法上,那麼就不會開始交易。 B和C單獨交易? – obogoliy
如果不放這個註解,那麼該方法將在父事務中運行,即如果調用此方法的父方法完成,事務將完成。而且我假設你正在從B中調用B和C中的方法,所以直到A完成B和C將在同一事務中運行 –
如果不是機密,你也可以發佈你的代碼嗎? –