如何使用JPA锁?

时间:2016-06-30 15:33:58

标签: java multithreading jpa eclipselink

是的,我知道问题可能非常广泛,但我不明白JPA锁是如何工作的。

我将举例说明我如何使用它:

public Account deposit(int id, double quantity) {
    Account a = super.find(id);
    if (a == null) {
        return null;
    }
    try {
        em.lock(a, LockModeType.PESSIMISTIC_WRITE);
        a.setSaldo(a.getSaldo() + quantity);

        LOG.log(Level.INFO, " //\u00a0 Se ha depositado, saldo :{0}", a.getSaldo());
    } catch (Exception oe) {
        LOG.log(Level.INFO, oe.getMessage());
    }
    return a;
}

你正在思考"所以?"

好吧,当我应用锁时,下一个语句将更新记录,而不是"合并"指令,但锁定完成后? ,这意味着我可以继续进行更改(即a.setFOO(bar)),直到达到return语句并提交更改?还是我需要另外锁?

AFAIK悲观的写锁定会使SELECT ... FOR UPDATE,但因为我没有" transaction.begin()"我不知道锁的范围。我是通过

注入实体经理
@PersistenceContext(unitName = "PruebaConcurrenciaPU")
private EntityManager em; 

谢谢!

0 个答案:

没有答案