Currently trying Pessimistic LockMode/Lock Options but this
results in a LockAcquisitionException. Ideally this would be blocking the
second thread trying to access the same record. Then when the first
thread releases lock the second would do its read and update.
EX:
We
have two threads that do a read. The first thread T1 appears to obtain
the lock.
T1(l)----> t =
Session().get(this.getType(), id, new LockOptions(LockMode.PESSIMISTIC_READ));
T2(1)----> t2 =
Session().get(this.getType(), id, new LockOptions(LockMode.PESSIMISTIC_READ));
T2(2)----> dao.update(t2);
T2(3)----> t2.commit()
org.hibernate.exception.LockAcquisitionException: could not update:
We want T2(1) to wait
until T1 is commited (versus blowing up). Here T2(1) appears to do a
dirty read of the object, and then throw an exception on commit T2(3).
Here
is our workaround, but we don't want to have to do this extra IO. Any
ideas on what to try?
public T
read(PK id) {
synchronized (LockingDao.class) {
t = session().get(class, id);
MyObject myObj = (MyObject)
t;
myObj.setLastModDate(new
Date());
update(t);
getSession().flush();
return t;
}
}
Any insight is much appreciated,
Sean