}
@Override
- public void start(Xid xid, int flags) throws XAException {
+ public synchronized void start(Xid xid, int flags) throws XAException {
if (editingXid != null)
throw new UserDirectoryException("Already editing " + editingXid);
UserDirectoryWorkingCopy wc = workingCopies.put(xid,
@Override
public void end(Xid xid, int flags) throws XAException {
checkXid(xid);
-
}
private UserDirectoryWorkingCopy wc(Xid xid) {
return workingCopies.get(xid);
}
- UserDirectoryWorkingCopy wc() {
+ synchronized UserDirectoryWorkingCopy wc() {
if (editingXid == null)
return null;
UserDirectoryWorkingCopy wc = workingCopies.get(editingXid);
return wc;
}
- private void cleanUp(Xid xid) {
- // clean collections
+ private synchronized void cleanUp(Xid xid) {
wc(xid).cleanUp();
workingCopies.remove(xid);
-
- // clean IDs
- // userDirectory.clearEditingTransactionXid();
+ editingXid = null;
}
@Override
userDirectory.prepare(wc);
} catch (Exception e) {
log.error("Cannot prepare " + xid, e);
- throw new XAException(XAException.XA_RBOTHER);
+ throw new XAException(XAException.XAER_RMERR);
}
return XA_OK;
}
userDirectory.commit(wc);
} catch (Exception e) {
log.error("Cannot commit " + xid, e);
- throw new XAException(XAException.XA_RBOTHER);
+ throw new XAException(XAException.XAER_RMERR);
} finally {
cleanUp(xid);
}
userDirectory.rollback(wc(xid));
} catch (Exception e) {
log.error("Cannot rollback " + xid, e);
- throw new XAException(XAException.XA_HEURMIX);
+ throw new XAException(XAException.XAER_RMERR);
} finally {
cleanUp(xid);
}