Witam,
Mam problem w jaki sposób najlepiej zapobiegaać race-conditions w JPA. To powinno być dość proste.
@Statless
public class SimpleDao implements ISimpleDao {
@PersistenceContext
private EntityManager em;
@Override
public void save(SimpleEntity m) {
if (countIllegal(m) == 0) {
em.persist(m);
}
}
// metoda countSimilar wyszukuje rekordy, które zabraniają dodaniu
@Override
public long countIllegal(SimpleEntity m) {
Query q = em.createNamedQuery("SimpleEntity.countIllegal");
q.setParameter("date", m.getName());
return (long) q.getSingleResult();
}
}
Named query to prosta agregacja typu SELECT COUNT(encja), ktora zawsze zwroci singleResult.
Czy ta metoda jest bezpieczna? Wydaje mi się, że powinienem założyć lock na query JPQL jak FOR UPDATE w SQL. Jak to zrobic?
Pozdrawiam