JPA executeUpdate可以无限期地锁定一行吗?

时间:2016-07-08 01:15:45

标签: java jpa eclipselink

这与my last question

有关

我在应用程序中实现了一个PESSIMISTIC_WRITE锁,以避免并发程序出现数据问题。

问题是即使这样,并且INNODB_LOCK_WAIT_TIMEOUT变量设置为120我仍然有死锁。

我正在检查源代码(我是这个项目中的新手),我们使用JPA更新行的方式与我以前不同。

我们使用类型化查询来更新行,即

TypedQuery<Account> q = em.createQuery("UPDATE Account a SET a.balance=a.balance+:quantity",Account.class);
q.setParameter("quantity",100);

q.executeUpdate();
return;

引起我注意的是没有提交,合并,刷新或任何确保我正在关闭事务的东西,比如来自EntityManager的合并方法。

1 个答案:

答案 0 :(得分:0)

我在Eclipse项目中使用的自动生成DAO代码显示了javadocs,例如

 * <pre>
 * EntityManagerHelper.beginTransaction();
 * NodesDAO.save(entity);
 * EntityManagerHelper.commit();
 * </pre>

使用此提示(也许查看其他代码),尝试

TypedQuery<Account> q = em.createQuery("UPDATE Account a SET a.balance=a.balance+:quantity",Account.class);
q.setParameter("quantity",100);

em.getTransaction().beginTransaction();
q.executeUpdate();
em.getTransaction().commit ();
顺便说一句,你不应该对PESSIMISTIC_WRITEINNODB_LOCK_WAIT_TIMEOUT

感到困惑