public void commit(final OTransaction iTx) { checkConnection(); do { try { OChannelBinaryClient network = null; try { network = beginRequest(OChannelBinaryProtocol.REQUEST_TX_COMMIT); network.writeInt(((OTransaction) iTx).getId()); network.writeByte((byte) (((OTransaction) iTx).isUsingLog() ? 1 : 0)); final List<OTransactionRecordEntry> tmpEntries = new ArrayList<OTransactionRecordEntry>(); while (iTx.getCurrentRecordEntries().iterator().hasNext()) { for (OTransactionRecordEntry txEntry : iTx.getCurrentRecordEntries()) tmpEntries.add(txEntry); iTx.clearRecordEntries(); if (tmpEntries.size() > 0) for (OTransactionRecordEntry txEntry : tmpEntries) commitEntry(network, txEntry); } // END OF RECORD ENTRIES network.writeByte((byte) 0); // SEND INDEX ENTRIES network.writeBytes(iTx.getIndexChanges().toStream()); } finally { endRequest(network); } try { beginResponse(network); final int createdRecords = network.readInt(); ORecordId currentRid; ORecordId createdRid; for (int i = 0; i < createdRecords; i++) { currentRid = network.readRID(); createdRid = network.readRID(); for (OTransactionRecordEntry txEntry : iTx.getAllRecordEntries()) { if (txEntry.getRecord().getIdentity().equals(currentRid)) { txEntry.getRecord().setIdentity(createdRid); break; } } } final int updatedRecords = network.readInt(); ORecordId rid; for (int i = 0; i < updatedRecords; ++i) { rid = network.readRID(); // SEARCH THE RECORD WITH THAT ID TO UPDATE THE VERSION for (OTransactionRecordEntry txEntry : iTx.getAllRecordEntries()) { if (txEntry.getRecord().getIdentity().equals(rid)) { txEntry.getRecord().setVersion(network.readInt()); break; } } } } finally { endResponse(network); } // SET ALL THE RECORDS AS UNDIRTY for (OTransactionRecordEntry txEntry : iTx.getAllRecordEntries()) txEntry.getRecord().unload(); // UPDATE THE CACHE ONLY IF THE ITERATOR ALLOWS IT. USE THE STRATEGY TO ALWAYS REMOVE ALL // THE RECORDS SINCE THEY COULD BE // CHANGED AS CONTENT IN CASE OF TREE AND GRAPH DUE TO CROSS REFERENCES OTransactionAbstract.updateCacheFromEntries(this, iTx, iTx.getAllRecordEntries(), false); break; } catch (OException e) { // PASS THROUGH throw e; } catch (Exception e) { handleException("Error on commit", e); } } while (true); }