With the help of the leads provided by AFaust, I was able to solve above issue with below code piece.
RetryingTransactionHelper txnHelper = serviceRegistry.getTransactionService().getRetryingTransactionHelper();
RetryingTransactionCallback<NodeRef> callback = new RetryingTransactionCallback<NodeRef>() {
public NodeRef execute() throws Throwable {
NodeRef newNode = upload(parent, TradeMarkModel.MARK_QNAME, serialNumber, fileName, inputStream, properties);
return newNode;
}
};
NodeRef newNodeRef = txnHelper.doInTransaction(callback, false, true);
PostResponse postResponse = new PostResponse();
postResponse.setDocumentId(serialNumber, TradeMarkModel.TYPE_MARK, fileName);
postResponse.setVersion((String) serviceRegistry.getNodeService().getProperty(newNodeRef, ContentModel.PROP_VERSION_LABEL));
The above code works fine for new node creation.
For Update node metadata:
You need to break down the writing on the node and then reading versionLabel as two separate transactions.
1a)
private void updateMarkProperties(final Map<QName, Serializable> properties, final NodeRef nodeRef) throws UpdateMarkMetadataFailedException {
RetryingTransactionHelper txnHelper = serviceRegistry.getTransactionService().getRetryingTransactionHelper();
RetryingTransactionCallback<Void> callback = new RetryingTransactionCallback<Void>() {
public Void execute() throws Throwable {
for (QName key : properties.keySet()) {
serviceRegistry.getNodeService().setProperty(nodeRef, key, properties.get(key));
}
return null;
}
};
txnHelper.doInTransaction(callback, false, true);
}
1b)
RetryingTransactionHelper txnHelper = serviceRegistry.getTransactionService().getRetryingTransactionHelper();
RetryingTransactionCallback<String> callback = new RetryingTransactionCallback<String>() {
public String execute() throws Throwable {
String verNo = (String) serviceRegistry.getNodeService().getProperty(markNodeRef,ContentModel.PROP_VERSION_LABEL);
return verNo;
}
};
String versionNumber = txnHelper.doInTransaction(callback, true, true);
postResponse.setVersion(versionNumber);
Update node content:
You need to follow above technique for content modification of the Node and then retrieval of versionLabel as two separate transaction.
Also there is another way to solve similar transaction problem: Sample method below
private NodeRef createCaseFolderAndCopyNode(final FileInfo fileInfo, final NodeRef efileNodeRef, final String trgtSerialNumber, final Map<QName, Serializable> newMetadataProperrties) {
NodeRef newDocumentTypeNode = null;
UserTransaction trx_A = serviceRegistry.getTransactionService().getNonPropagatingUserTransaction();
try {
trx_A.begin();
NodeRef caseFolderNodeRef = caseService.getCaseFolderNodeRef(trgtSerialNumber, true);
QName assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, fileInfo.getName());
newDocumentTypeNode = serviceRegistry.getCopyService().copy(efileNodeRef, caseFolderNodeRef, ContentModel.ASSOC_CONTAINS, assocQName);
serviceRegistry.getNodeService().setProperty(newDocumentTypeNode, ContentModel.PROP_NAME, fileInfo.getName());
serviceRegistry.getNodeService().setProperty(newDocumentTypeNode, TradeMarkModel.SERIAL_NUMBER_QNAME, trgtSerialNumber);
if (newMetadataProperrties != null && !(newMetadataProperrties.isEmpty())) {
updateDocumentMetadata(newMetadataProperrties, newDocumentTypeNode);
}
trx_A.commit();
} catch (Throwable e) {
try {
trx_A.rollback();
} catch (Throwable ee) {
}
}
return newDocumentTypeNode;