我在应用程序中实现了一个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的合并方法。
答案 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_WRITE
和INNODB_LOCK_WAIT_TIMEOUT
感到困惑