我有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将在同一事务中运行 –
如果不是机密,你也可以发布你的代码吗? –