3 つの EJB ステートレス Bean があります。A - ビジネス層で。B、C - 永続層の。
Bean A は B と C を呼び出して、データベース (DB2) 内のデータを更新します。
しかし残念なことに、Bean C を呼び出すと、データベースがロックされます。B と C が異なるトランザクションで実行される可能性はありますか? そうしないと、DB2 がロックする理由がわかりません...
3 つの EJB ステートレス Bean があります。A - ビジネス層で。B、C - 永続層の。
Bean A は B と C を呼び出して、データベース (DB2) 内のデータを更新します。
しかし残念なことに、Bean C を呼び出すと、データベースがロックされます。B と C が異なるトランザクションで実行される可能性はありますか? そうしないと、DB2 がロックする理由がわかりません...
JBoss AS 7 を使用しています。Employer と EMployee の 2 つのエンティティがあります。従業員には雇用主へのリンクがあります。
私は持っている
@Stateless
EployerService {
....
public void lockEmployer (long id) {
Employer employer = employerDAO.findById(id);
employer.setLocked(true);
employerDAO.updateEmployer(employer);
employeeDAO.updateEmployeesByEmployerId(id);
}
}
従業員DAOで
updateEmployeesByEmployerId (long empId) {
em.createQuery("update Employee set locked = true where emplopyerId=:id").setParameter("id", empId).executeUpdate();
}
雇用者DAOで
udpateEmplopyer(Employer employer) {
em.merge(employer);
}
両方のdaoのすべてのロジックを1つのDAOに入れると、ロックはありません!
持続性プロバイダーとして hibernate を使用している場合@TransactionAttribute(REQUIRES_NEW)
、ビジネス メソッドで呼び出されるトランザクション アノテーションが提供されます。このアノテーションは、別のトランザクションでメソッドを実行します。したがって、JPAにはこれに代わるものがあるはずです。しかし、よくわかりません。