hello,
I don't know how to solve concurrency problems in a nice way. To fix my updating code I set version control for entity and I check if get OptimisticLockException.
I think this is not the best solution, so I wish to know what is a beter solution for this classic case. I think I should get a record, lock it, update fields and unluck it ... but I don't know how to do it.
Thanks a lot for help
My code for update looks like this (strange enough for only one update):
while(true){ boolean ok = true; Balance balance = testSessionA.getBalance(id,sleepTime);//sleep used just for testing balance.setAmount(balance.getAmount()+10); try{ testSessionA.update(balance); }catch(javax.ejb.EJBException ex){ ex.printStackTrace(); if(ex.getMessage().equals("javax.persistence.OptimisticLockException")){ //how many times we should try to update?? ok = false; } } if(ok){ break; } }
@Stateless @Remote(TestSessionA.class) @Local(TestSessionA.class) public class TestSessionABean implements TestSessionA{ public Balance getBalance(long bId, long sleepTime) throws Exception { Balance b = em.find(Balance.class, bId); Thread.sleep(sleepTime);//use sleep just to test return b; } public void update(Balance balance) { em.merge(balance); }
@Entity public class Balance implements Serializable{ @Version @Column(name = "OPTLOCK") public int getVersion() { return version; }