RANGER-3163: Created individual DB transactions for each create/update user when the request comes from usersync and retry for service user creation
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
index 010f320..ceb8208 100755
--- a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
@@ -79,18 +79,25 @@
 import org.apache.ranger.entity.XXTrxLog;
 import org.apache.ranger.entity.XXUser;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.TransactionDefinition;
+import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.ranger.entity.XXPortalUserRole;
+import org.springframework.transaction.support.TransactionCallback;
+import org.springframework.transaction.support.TransactionTemplate;
 
 @Component
 public class XUserMgr extends XUserMgrBase {
 
 	private static final String RANGER_USER_GROUP_GLOBAL_STATE_NAME = "RangerUserStore";
+	private static final int MAX_DB_TRANSACTION_RETRIES = 5;
 
 	@Autowired
 	XUserService xUserService;
@@ -121,7 +128,7 @@ public class XUserMgr extends XUserMgrBase {
 
 	@Autowired
 	XPortalUserService xPortalUserService;
-	
+
 	@Autowired
 	XResourceService xResourceService;
 
@@ -146,6 +153,10 @@ public class XUserMgr extends XUserMgrBase {
 	@Autowired
 	StringUtil stringUtil;
 
+	@Autowired
+	@Qualifier(value = "transactionManager")
+	PlatformTransactionManager txManager;
+
 	static final Logger logger = Logger.getLogger(XUserMgr.class);
 
 	public VXUser getXUserByUserName(String userName) {
@@ -168,8 +179,8 @@ public VXGroup getGroupByGroupName(String groupName) {
 
 	public VXUser createXUser(VXUser vXUser) {
 		checkAdminAccess();
-                xaBizUtil.blockAuditorRoleUser();
-                validatePassword(vXUser);
+		xaBizUtil.blockAuditorRoleUser();
+		validatePassword(vXUser);
 		String userName = vXUser.getName();
 		if (userName == null || "null".equalsIgnoreCase(userName)
 				|| userName.trim().isEmpty()) {
@@ -363,7 +374,7 @@ public VXUser updateXUser(VXUser vXUser) {
 					+ "username.", MessageEnums.INVALID_INPUT_DATA);
 		}
 		checkAccess(vXUser.getName());
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		VXPortalUser oldUserProfile = userMgr.getUserProfileByLoginId(vXUser
 				.getName());
 		if (oldUserProfile == null) {
@@ -397,7 +408,7 @@ public VXUser updateXUser(VXUser vXUser) {
 		} else {
 			vXPortalUser.setPublicScreenName(vXUser.getName());
 		}
-    vXPortalUser.setUserSource(oldUserProfile.getUserSource());
+		vXPortalUser.setUserSource(oldUserProfile.getUserSource());
 
 		String hiddenPasswordString = PropertiesUtil.getProperty("ranger.password.hidden", "*****");
 		String password = vXUser.getPassword();
@@ -405,14 +416,14 @@ public VXUser updateXUser(VXUser vXUser) {
 				&& password.equals(hiddenPasswordString)) {
 			vXPortalUser.setPassword(oldUserProfile.getPassword());
 		}
-                else if(oldUserProfile != null && oldUserProfile.getUserSource() == RangerCommonEnums.USER_EXTERNAL && password != null){
-                        vXPortalUser.setPassword(oldUserProfile.getPassword());
-                        logger.debug("User is trrying to change external user password which we are not allowing it to change");
-                }
-        else if(password != null){
-                validatePassword(vXUser);
-                vXPortalUser.setPassword(password);
-        }
+		else if(oldUserProfile != null && oldUserProfile.getUserSource() == RangerCommonEnums.USER_EXTERNAL && password != null){
+			vXPortalUser.setPassword(oldUserProfile.getPassword());
+			logger.debug("User is trrying to change external user password which we are not allowing it to change");
+		}
+		else if(password != null){
+			validatePassword(vXUser);
+			vXPortalUser.setPassword(password);
+		}
 		Collection<Long> groupIdList = vXUser.getGroupIdList();
 		XXPortalUser xXPortalUser = new XXPortalUser();
 		xXPortalUser = userMgr.updateUserWithPass(vXPortalUser);
@@ -428,7 +439,7 @@ else if(password != null){
 							roleListUpdatedProfile.add(role);
 						}
 					}
-					
+
 				}
 			}
 		}
@@ -552,50 +563,50 @@ private List<XXTrxLog> createOrDelGrpUserWithUpdatedGrpId(VXUser vXUser, Collect
 		return trxLogList;
 	}
 
-        public VXUserGroupInfo createXUserGroupFromMap(VXUserGroupInfo vXUserGroupInfo) {
+	public VXUserGroupInfo createXUserGroupFromMap(VXUserGroupInfo vXUserGroupInfo) {
 		checkAdminAccess();
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		VXUserGroupInfo vxUGInfo = new VXUserGroupInfo();
-        VXUser vXUser = vXUserGroupInfo.getXuserInfo();
-        VXPortalUser vXPortalUser = userMgr.getUserProfileByLoginId(vXUser
-                .getName());
-        XXPortalUser xxPortalUser = daoManager.getXXPortalUser().findByLoginId(
-                vXUser.getName());
-        Collection<String> reqRoleList = vXUser.getUserRoleList();
-        List<String> existingRole = daoManager.getXXPortalUserRole()
-                .findXPortalUserRolebyXPortalUserId(xxPortalUser.getId());
-        if (xxPortalUser.getUserSource() == RangerCommonEnums.USER_EXTERNAL) {
-            vXPortalUser = userMgr.updateRoleForExternalUsers(reqRoleList, existingRole, vXPortalUser);
-        }
-        vXUser = xUserService.createXUserWithOutLogin(vXUser);
-        vxUGInfo.setXuserInfo(vXUser);
-        List<VXGroup> vxg = new ArrayList<VXGroup>();
-        for (VXGroup vXGroup : vXUserGroupInfo.getXgroupInfo()) {
-            VXGroup VvXGroup = xGroupService.createXGroupWithOutLogin(vXGroup);
-            vxg.add(VvXGroup);
-            VXGroupUser vXGroupUser = new VXGroupUser();
-            vXGroupUser.setUserId(vXUser.getId());
-            vXGroupUser.setName(VvXGroup.getName());
-            vXGroupUser = xGroupUserService
-                    .createXGroupUserWithOutLogin(vXGroupUser);
-        }
-        if (vXPortalUser != null) {
-            assignPermissionToUser(vXPortalUser, true);
-        }
+		VXUser vXUser = vXUserGroupInfo.getXuserInfo();
+		VXPortalUser vXPortalUser = userMgr.getUserProfileByLoginId(vXUser
+				.getName());
+		XXPortalUser xxPortalUser = daoManager.getXXPortalUser().findByLoginId(
+				vXUser.getName());
+		Collection<String> reqRoleList = vXUser.getUserRoleList();
+		List<String> existingRole = daoManager.getXXPortalUserRole()
+				.findXPortalUserRolebyXPortalUserId(xxPortalUser.getId());
+		if (xxPortalUser.getUserSource() == RangerCommonEnums.USER_EXTERNAL) {
+			vXPortalUser = userMgr.updateRoleForExternalUsers(reqRoleList, existingRole, vXPortalUser);
+		}
+		vXUser = xUserService.createXUserWithOutLogin(vXUser);
+		vxUGInfo.setXuserInfo(vXUser);
+		List<VXGroup> vxg = new ArrayList<VXGroup>();
+		for (VXGroup vXGroup : vXUserGroupInfo.getXgroupInfo()) {
+			VXGroup VvXGroup = xGroupService.createXGroupWithOutLogin(vXGroup);
+			vxg.add(VvXGroup);
+			VXGroupUser vXGroupUser = new VXGroupUser();
+			vXGroupUser.setUserId(vXUser.getId());
+			vXGroupUser.setName(VvXGroup.getName());
+			vXGroupUser = xGroupUserService
+					.createXGroupUserWithOutLogin(vXGroupUser);
+		}
+		if (vXPortalUser != null) {
+			assignPermissionToUser(vXPortalUser, true);
+		}
 		vxUGInfo.setXgroupInfo(vxg);
-        try {
+		try {
 			daoManager.getXXGlobalState().onGlobalAppDataChange(RANGER_USER_GROUP_GLOBAL_STATE_NAME);
 		} catch (Exception excp) {
 			logger.error("createXUserGroupFromMap(" + vXUser.getName() + ") failed", excp);
 		}
 		return vxUGInfo;
 	}
-	
+
 	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
 	public VXGroupUserInfo createXGroupUserFromMap(
 			VXGroupUserInfo vXGroupUserInfo) {
 		checkAdminAccess();
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		VXGroupUserInfo vxGUInfo = new VXGroupUserInfo();
 
 		VXGroup vXGroup = vXGroupUserInfo.getXgroupInfo();
@@ -606,12 +617,12 @@ public VXGroupUserInfo createXGroupUserFromMap(
 		}*/
 
 		List<VXUser> vxu = new ArrayList<VXUser>();
-        for (VXUser vXUser : vXGroupUserInfo.getXuserInfo()) {
-            XXUser xUser = daoManager.getXXUser().findByUserName(
+		for (VXUser vXUser : vXGroupUserInfo.getXuserInfo()) {
+			XXUser xUser = daoManager.getXXUser().findByUserName(
 					vXUser.getName());
-            XXPortalUser xXPortalUser = daoManager.getXXPortalUser()
-                    .findByLoginId(vXUser.getName());
-            if (xUser != null) {
+			XXPortalUser xXPortalUser = daoManager.getXXPortalUser()
+					.findByLoginId(vXUser.getName());
+			if (xUser != null) {
 				// Add or update group user mapping only if the user already exists in x_user table.
 				logger.debug(String.format("createXGroupUserFromMap(): Create or update group %s ", vXGroup.getName()));
 				vXGroup = xGroupService.createXGroupWithOutLogin(vXGroup);
@@ -620,26 +631,26 @@ public VXGroupUserInfo createXGroupUserFromMap(
 				VXGroupUser vXGroupUser = new VXGroupUser();
 				vXGroupUser.setUserId(xUser.getId());
 				vXGroupUser.setName(vXGroup.getName());
-                if (xXPortalUser.getUserSource() == RangerCommonEnums.USER_EXTERNAL) {
-                    vXGroupUser = xGroupUserService
-                            .createXGroupUserWithOutLogin(vXGroupUser);
-		    logger.debug(String.format("createXGroupUserFromMap(): Create or update group user mapping with groupname =  " + vXGroup.getName()
-											+ " username = %s userId = %d", xXPortalUser.getLoginId(), xUser.getId()));
-                }
-                Collection<String> reqRoleList = vXUser.getUserRoleList();
+				if (xXPortalUser.getUserSource() == RangerCommonEnums.USER_EXTERNAL) {
+					vXGroupUser = xGroupUserService
+							.createXGroupUserWithOutLogin(vXGroupUser);
+					logger.debug(String.format("createXGroupUserFromMap(): Create or update group user mapping with groupname =  " + vXGroup.getName()
+							+ " username = %s userId = %d", xXPortalUser.getLoginId(), xUser.getId()));
+				}
+				Collection<String> reqRoleList = vXUser.getUserRoleList();
 
-                XXPortalUser xxPortalUser = daoManager.getXXPortalUser()
-                        .findByLoginId(vXUser.getName());
-                List<String> existingRole = daoManager.getXXPortalUserRole()
-                        .findXPortalUserRolebyXPortalUserId(
-                                xxPortalUser.getId());
-                VXPortalUser vxPortalUser = userMgr
-                        .mapXXPortalUserToVXPortalUserForDefaultAccount(xxPortalUser);
-                if (xxPortalUser.getUserSource() == RangerCommonEnums.USER_EXTERNAL) {
-                    vxPortalUser = userMgr.updateRoleForExternalUsers(
-                            reqRoleList, existingRole, vxPortalUser);
-                    assignPermissionToUser(vxPortalUser, true);
-                }
+				XXPortalUser xxPortalUser = daoManager.getXXPortalUser()
+						.findByLoginId(vXUser.getName());
+				List<String> existingRole = daoManager.getXXPortalUserRole()
+						.findXPortalUserRolebyXPortalUserId(
+								xxPortalUser.getId());
+				VXPortalUser vxPortalUser = userMgr
+						.mapXXPortalUserToVXPortalUserForDefaultAccount(xxPortalUser);
+				if (xxPortalUser.getUserSource() == RangerCommonEnums.USER_EXTERNAL) {
+					vxPortalUser = userMgr.updateRoleForExternalUsers(
+							reqRoleList, existingRole, vxPortalUser);
+					assignPermissionToUser(vxPortalUser, true);
+				}
 			}
 		}
 
@@ -678,17 +689,17 @@ public VXGroupUserInfo getXGroupUserFromMap(
 			if (xUser != null) {
 				VXUser vxUser = new VXUser();
 				vxUser.setName(xUser.getName());
-                XXPortalUser xXPortalUser = daoManager.getXXPortalUser()
-                        .findByLoginId(xUser.getName());
-                if (xXPortalUser != null) {
-                    List<String> existingRole = daoManager
-                            .getXXPortalUserRole()
-                            .findXPortalUserRolebyXPortalUserId(
-                                    xXPortalUser.getId());
-                    if (existingRole != null) {
-                        vxUser.setUserRoleList(existingRole);
-                    }
-                }
+				XXPortalUser xXPortalUser = daoManager.getXXPortalUser()
+						.findByLoginId(xUser.getName());
+				if (xXPortalUser != null) {
+					List<String> existingRole = daoManager
+							.getXXPortalUserRole()
+							.findXPortalUserRolebyXPortalUserId(
+									xXPortalUser.getId());
+					if (existingRole != null) {
+						vxUser.setUserRoleList(existingRole);
+					}
+				}
 				vxu.add(vxUser);
 			}
 
@@ -701,8 +712,8 @@ public VXGroupUserInfo getXGroupUserFromMap(
 
 	public VXUser createXUserWithOutLogin(VXUser vXUser) {
 		checkAdminAccess();
-                xaBizUtil.blockAuditorRoleUser();
-                validatePassword(vXUser);
+		xaBizUtil.blockAuditorRoleUser();
+		validatePassword(vXUser);
 		return xUserService.createXUserWithOutLogin(vXUser);
 	}
 
@@ -714,7 +725,7 @@ public VXUser createExternalUser(String userName) {
 
 	public VXGroup createXGroup(VXGroup vXGroup) {
 		checkAdminAccess();
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		if (vXGroup.getDescription() == null) {
 			vXGroup.setDescription(vXGroup.getName());
 		}
@@ -728,13 +739,13 @@ public VXGroup createXGroup(VXGroup vXGroup) {
 
 	public VXGroup createXGroupWithoutLogin(VXGroup vXGroup) {
 		checkAdminAccess();
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		return xGroupService.createXGroupWithOutLogin(vXGroup);
 	}
 
 	public VXGroupUser createXGroupUser(VXGroupUser vXGroupUser) {
 		checkAdminAccess();
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		vXGroupUser = xGroupUserService
 				.createXGroupUserWithOutLogin(vXGroupUser);
 		return vXGroupUser;
@@ -764,7 +775,7 @@ private boolean hasAccessToGetUserInfo(VXUser requestedVXUser) {
 			if (loggedInVXUser != null) {
 				if (loggedInVXUser.getUserRoleList().size() == 1
 						&& loggedInVXUser.getUserRoleList().contains(
-								RangerConstants.ROLE_USER)) {
+						RangerConstants.ROLE_USER)) {
 
 					return requestedVXUser.getId().equals(loggedInVXUser.getId()) ? true : false;
 
@@ -791,7 +802,7 @@ public VXGroup getXGroup(Long id) {
 			if (loggedInVXUser != null) {
 				if (loggedInVXUser.getUserRoleList().size() == 1
 						&& loggedInVXUser.getUserRoleList().contains(
-								RangerConstants.ROLE_USER)) {
+						RangerConstants.ROLE_USER)) {
 
 					List<Long> listGroupId = daoManager.getXXGroupUser()
 							.findGroupIdListByUserId(loggedInVXUser.getId());
@@ -839,7 +850,7 @@ public VXGroup getXGroup(Long id) {
 
 	public void deleteXGroupAndXUser(String groupName, String userName) {
 		checkAdminAccess();
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		VXGroup vxGroup = xGroupService.getGroupByGroupName(groupName);
 		VXUser vxUser = xUserService.getXUserByUserName(userName);
 		SearchCriteria searchCriteria = new SearchCriteria();
@@ -913,7 +924,7 @@ public VXUserList getXGroupUsers(SearchCriteria searchCriteria) {
 		if (!msBizUtil.hasModuleAccess(RangerConstants.MODULE_USER_GROUPS)) {
 			throw restErrorUtil.createRESTException(HttpServletResponse.SC_FORBIDDEN, "User is not having permissions on the "+RangerConstants.MODULE_USER_GROUPS+" module.", true);
 		}
-                VXUserList vXUserList = new VXUserList();
+		VXUserList vXUserList = new VXUserList();
 
 		VXGroupUserList vXGroupUserList = xGroupUserService
 				.searchXGroupUsers(searchCriteria);
@@ -932,14 +943,14 @@ public VXUserList getXGroupUsers(SearchCriteria searchCriteria) {
 
 			}
 			vXUserList.setVXUsers(vXUsers);
-                        vXUserList.setStartIndex(searchCriteria.getStartIndex());
-                        vXUserList.setResultSize(vXGroupUserList.getList().size());
-                        vXUserList.setTotalCount(vXGroupUserList.getTotalCount());
-                        vXUserList.setPageSize(searchCriteria.getMaxRows());
-                        vXUserList.setSortBy(vXGroupUserList.getSortBy());
-                        vXUserList.setSortType(vXGroupUserList.getSortType());
+			vXUserList.setStartIndex(searchCriteria.getStartIndex());
+			vXUserList.setResultSize(vXGroupUserList.getList().size());
+			vXUserList.setTotalCount(vXGroupUserList.getTotalCount());
+			vXUserList.setPageSize(searchCriteria.getMaxRows());
+			vXUserList.setSortBy(vXGroupUserList.getSortBy());
+			vXUserList.setSortType(vXGroupUserList.getSortType());
 		} else {
-                        logger.debug("No users found for group id : " + searchCriteria.getParamValue("xGroupId"));
+			logger.debug("No users found for group id : " + searchCriteria.getParamValue("xGroupId"));
 		}
 		return vXUserList;
 	}
@@ -947,7 +958,7 @@ public VXUserList getXGroupUsers(SearchCriteria searchCriteria) {
 	@Override
 	public VXGroup updateXGroup(VXGroup vXGroup) {
 		checkAdminAccess();
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		XXGroup xGroup = daoManager.getXXGroup().getById(vXGroup.getId());
 		if (vXGroup != null && xGroup != null && !vXGroup.getName().equals(xGroup.getName())) {
 			throw restErrorUtil.createRESTException(
@@ -978,36 +989,36 @@ protected void updateXgroupUserForGroupUpdate(VXGroup vXGroup) {
 
 	public VXGroupUser updateXGroupUser(VXGroupUser vXGroupUser) {
 		checkAdminAccess();
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		return super.updateXGroupUser(vXGroupUser);
 	}
 
 	public void deleteXGroupUser(Long id, boolean force) {
 		checkAdminAccess();
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		super.deleteXGroupUser(id, force);
 	}
 
 	public VXGroupGroup createXGroupGroup(VXGroupGroup vXGroupGroup){
 		checkAdminAccess();
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		return super.createXGroupGroup(vXGroupGroup);
 	}
 
 	public VXGroupGroup updateXGroupGroup(VXGroupGroup vXGroupGroup) {
 		checkAdminAccess();
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		return super.updateXGroupGroup(vXGroupGroup);
 	}
 
 	public void deleteXGroupGroup(Long id, boolean force) {
 		checkAdminAccess();
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		super.deleteXGroupGroup(id, force);
 	}
 
 	public void deleteXPermMap(Long id, boolean force) {
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		if (force) {
 			XXPermMap xPermMap = daoManager.getXXPermMap().getById(id);
 			if (xPermMap != null) {
@@ -1030,7 +1041,7 @@ public VXLong getXPermMapSearchCount(SearchCriteria searchCriteria) {
 	}
 
 	public void deleteXAuditMap(Long id, boolean force) {
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		if (force) {
 			XXAuditMap xAuditMap = daoManager.getXXAuditMap().getById(id);
 			if (xAuditMap != null) {
@@ -1054,7 +1065,7 @@ public VXLong getXAuditMapSearchCount(SearchCriteria searchCriteria) {
 
 	public void modifyUserVisibility(HashMap<Long, Integer> visibilityMap) {
 		checkAdminAccess();
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		Set<Map.Entry<Long, Integer>> entries = visibilityMap.entrySet();
 		for (Map.Entry<Long, Integer> entry : entries) {
 			XXUser xUser = daoManager.getXXUser().getById(entry.getKey());
@@ -1066,7 +1077,7 @@ public void modifyUserVisibility(HashMap<Long, Integer> visibilityMap) {
 
 	public void modifyGroupsVisibility(HashMap<Long, Integer> groupVisibilityMap) {
 		checkAdminAccess();
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		Set<Map.Entry<Long, Integer>> entries = groupVisibilityMap.entrySet();
 		for (Map.Entry<Long, Integer> entry : entries) {
 			XXGroup xGroup = daoManager.getXXGroup().getById(entry.getKey());
@@ -1107,26 +1118,26 @@ public VXModuleDef updateXModuleDefPermission(VXModuleDef vXModuleDef) {
 		VXModuleDef vModuleDefPopulateOld = xModuleDefService.populateViewBean(xModuleDef);
 
 		List<XXGroupPermission> xgroupPermissionList = daoManager.getXXGroupPermission().findByModuleId(vXModuleDef.getId(), true);
-                Map<Long, XXGroup> xXGroupMap=xGroupService.getXXGroupIdXXGroupMap();
-                if(xXGroupMap==null || xXGroupMap.isEmpty()){
-                        for (XXGroupPermission xGrpPerm : xgroupPermissionList) {
-                                VXGroupPermission vXGrpPerm = xGroupPermissionService.populateViewBean(xGrpPerm);
-                                groupPermListOld.add(vXGrpPerm);
-                        }
-                }else{
-                        groupPermListOld=xGroupPermissionService.getPopulatedVXGroupPermissionList(xgroupPermissionList,xXGroupMap,vModuleDefPopulateOld);
+		Map<Long, XXGroup> xXGroupMap=xGroupService.getXXGroupIdXXGroupMap();
+		if(xXGroupMap==null || xXGroupMap.isEmpty()){
+			for (XXGroupPermission xGrpPerm : xgroupPermissionList) {
+				VXGroupPermission vXGrpPerm = xGroupPermissionService.populateViewBean(xGrpPerm);
+				groupPermListOld.add(vXGrpPerm);
+			}
+		}else{
+			groupPermListOld=xGroupPermissionService.getPopulatedVXGroupPermissionList(xgroupPermissionList,xXGroupMap,vModuleDefPopulateOld);
 		}
 		vModuleDefPopulateOld.setGroupPermList(groupPermListOld);
 
 		List<XXUserPermission> xuserPermissionList = daoManager.getXXUserPermission().findByModuleId(vXModuleDef.getId(), true);
-                Map<Long, XXUser> xXPortalUserIdXXUserMap=xUserService.getXXPortalUserIdXXUserMap();
-                if(xXPortalUserIdXXUserMap==null || xXPortalUserIdXXUserMap.isEmpty()){
-                        for (XXUserPermission xUserPerm : xuserPermissionList) {
-                                VXUserPermission vUserPerm = xUserPermissionService.populateViewBean(xUserPerm);
-                                userPermListOld.add(vUserPerm);
-                        }
-                }else{
-                        userPermListOld=xUserPermissionService.getPopulatedVXUserPermissionList(xuserPermissionList,xXPortalUserIdXXUserMap,vModuleDefPopulateOld);
+		Map<Long, XXUser> xXPortalUserIdXXUserMap=xUserService.getXXPortalUserIdXXUserMap();
+		if(xXPortalUserIdXXUserMap==null || xXPortalUserIdXXUserMap.isEmpty()){
+			for (XXUserPermission xUserPerm : xuserPermissionList) {
+				VXUserPermission vUserPerm = xUserPermissionService.populateViewBean(xUserPerm);
+				userPermListOld.add(vUserPerm);
+			}
+		}else{
+			userPermListOld=xUserPermissionService.getPopulatedVXUserPermissionList(xuserPermissionList,xXPortalUserIdXXUserMap,vModuleDefPopulateOld);
 		}
 		vModuleDefPopulateOld.setUserPermList(userPermListOld);
 
@@ -1435,7 +1446,7 @@ public VXAuditMapList searchXAuditMaps(SearchCriteria searchCriteria) {
 	}
 
 	private void populatePageList(List<VXAuditMap> auditMapList, int startIndex, int pageSize,
-			VXAuditMapList vxAuditMapList) {
+								  VXAuditMapList vxAuditMapList) {
 		List<VXAuditMap> onePageList = new ArrayList<VXAuditMap>();
 		for (int i = startIndex; i < pageSize + startIndex && i < auditMapList.size(); i++) {
 			VXAuditMap vXAuditMap = auditMapList.get(i);
@@ -1449,52 +1460,52 @@ private void populatePageList(List<VXAuditMap> auditMapList, int startIndex, int
 	}
 
 	public void checkAccessRoles(List<String> stringRolesList) {
-        UserSessionBase session = ContextUtil.getCurrentUserSession();
-        if (session != null && stringRolesList != null) {
-            if (!session.isUserAdmin() && !session.isKeyAdmin()) {
-                throw restErrorUtil.create403RESTException("Permission"
-                        + " denied. LoggedInUser="
-                        + (session != null ? session.getXXPortalUser().getId()
-                                : "Not Logged In")
-                        + " ,isn't permitted to perform the action.");
-            } else {
-                if (!"rangerusersync".equals(session.getXXPortalUser()
-                        .getLoginId())) {// new logic for rangerusersync user
-                    if (session.isUserAdmin()
-                            && stringRolesList
-                                    .contains(RangerConstants.ROLE_KEY_ADMIN)) {
-                        throw restErrorUtil.create403RESTException("Permission"
-                                + " denied. LoggedInUser="
-                                + (session != null ? session.getXXPortalUser()
-                                        .getId() : "")
-                                + " isn't permitted to perform the action.");
-                    }
-                    if (session.isKeyAdmin()
-                            && stringRolesList
-                                    .contains(RangerConstants.ROLE_SYS_ADMIN)) {
-                        throw restErrorUtil.create403RESTException("Permission"
-                                + " denied. LoggedInUser="
-                                + (session != null ? session.getXXPortalUser()
-                                        .getId() : "")
-                                + " isn't permitted to perform the action.");
-                    }
-                } else {
-                    logger.info("LoggedInUser="
-                            + (session != null ? session.getXXPortalUser()
-                                    .getId() : "")
-                                    + " is permitted to perform the action.");
-                }
-            }
-        } else {
-            VXResponse vXResponse = new VXResponse();
-            vXResponse.setStatusCode(HttpServletResponse.SC_UNAUTHORIZED);
-            vXResponse.setMsgDesc("Bad Credentials");
-            throw restErrorUtil.generateRESTException(vXResponse);
-        }
+		UserSessionBase session = ContextUtil.getCurrentUserSession();
+		if (session != null && stringRolesList != null) {
+			if (!session.isUserAdmin() && !session.isKeyAdmin()) {
+				throw restErrorUtil.create403RESTException("Permission"
+						+ " denied. LoggedInUser="
+						+ (session != null ? session.getXXPortalUser().getId()
+						: "Not Logged In")
+						+ " ,isn't permitted to perform the action.");
+			} else {
+				if (!"rangerusersync".equals(session.getXXPortalUser()
+						.getLoginId())) {// new logic for rangerusersync user
+					if (session.isUserAdmin()
+							&& stringRolesList
+							.contains(RangerConstants.ROLE_KEY_ADMIN)) {
+						throw restErrorUtil.create403RESTException("Permission"
+								+ " denied. LoggedInUser="
+								+ (session != null ? session.getXXPortalUser()
+								.getId() : "")
+								+ " isn't permitted to perform the action.");
+					}
+					if (session.isKeyAdmin()
+							&& stringRolesList
+							.contains(RangerConstants.ROLE_SYS_ADMIN)) {
+						throw restErrorUtil.create403RESTException("Permission"
+								+ " denied. LoggedInUser="
+								+ (session != null ? session.getXXPortalUser()
+								.getId() : "")
+								+ " isn't permitted to perform the action.");
+					}
+				} else {
+					logger.info("LoggedInUser="
+							+ (session != null ? session.getXXPortalUser()
+							.getId() : "")
+							+ " is permitted to perform the action.");
+				}
+			}
+		} else {
+			VXResponse vXResponse = new VXResponse();
+			vXResponse.setStatusCode(HttpServletResponse.SC_UNAUTHORIZED);
+			vXResponse.setMsgDesc("Bad Credentials");
+			throw restErrorUtil.generateRESTException(vXResponse);
+		}
 	}
 
 	public VXStringList setUserRolesByExternalID(Long userId, List<VXString> vStringRolesList) {
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		List<String> roleListNewProfile = new ArrayList<String>();
 		if(vStringRolesList!=null){
 			for (VXString vXString : vStringRolesList) {
@@ -1520,7 +1531,7 @@ public VXStringList setUserRolesByExternalID(Long userId, List<VXString> vString
 	}
 
 	public VXStringList setUserRolesByName(String userName, List<VXString> vStringRolesList) {
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		List<String> roleListNewProfile = new ArrayList<String>();
 		if(vStringRolesList!=null){
 			for (VXString vXString : vStringRolesList) {
@@ -1556,7 +1567,7 @@ public VXStringList getUserRolesByExternalID(Long userId) {
 			portalUserRoleList = daoManager.getXXPortalUserRole().findByUserId(oldUserProfile.getId());
 			return getStringListFromUserRoleList(portalUserRoleList);
 		}else{
-				throw restErrorUtil.createRESTException("User ID doesn't exist.", MessageEnums.INVALID_INPUT_DATA);
+			throw restErrorUtil.createRESTException("User ID doesn't exist.", MessageEnums.INVALID_INPUT_DATA);
 		}
 	}
 
@@ -1580,14 +1591,14 @@ public void updateUserRolesPermissions(VXPortalUser oldUserProfile,List<String>
 		//update permissions start
 		Collection<String> roleListUpdatedProfile =new ArrayList<String>();
 		if (oldUserProfile != null && oldUserProfile.getId() != null) {
-				Collection<String> roleListOldProfile = oldUserProfile.getUserRoleList();
-				if(roleListNewProfile!=null && roleListOldProfile!=null){
-					for (String role : roleListNewProfile) {
-						if(role!=null && !roleListOldProfile.contains(role)){
-							roleListUpdatedProfile.add(role);
-						}
+			Collection<String> roleListOldProfile = oldUserProfile.getUserRoleList();
+			if(roleListNewProfile!=null && roleListOldProfile!=null){
+				for (String role : roleListNewProfile) {
+					if(role!=null && !roleListOldProfile.contains(role)){
+						roleListUpdatedProfile.add(role);
 					}
 				}
+			}
 		}
 		if(roleListUpdatedProfile!=null && roleListUpdatedProfile.size()>0){
 			oldUserProfile.setUserRoleList(roleListUpdatedProfile);
@@ -1607,7 +1618,7 @@ public void updateUserRolesPermissions(VXPortalUser oldUserProfile,List<String>
 			}
 		}
 		//update permissions end
-		}
+	}
 
 	public VXStringList getStringListFromUserRoleList(
 			List<XXPortalUserRole> listXXPortalUserRole) {
@@ -1654,10 +1665,10 @@ public VXUser getMaskedVXUser(VXUser vXUser) {
 	}
 
 	public VXGroup getMaskedVXGroup(VXGroup vXGroup) {
-        if(vXGroup!=null){
-            vXGroup.setUpdatedBy(AppConstants.Masked_String);
-        }
-        return vXGroup;
+		if(vXGroup!=null){
+			vXGroup.setUpdatedBy(AppConstants.Masked_String);
+		}
+		return vXGroup;
 	}
 
 	@Override
@@ -1666,7 +1677,7 @@ public VXUserList searchXUsers(SearchCriteria searchCriteria) {
 		VXUser vXUserExactMatch = null;
 		try{
 			VXUserList vXUserListSort = new VXUserList();
-			
+
 			if(searchCriteria.getParamList() != null && searchCriteria.getParamList().get("name") != null){
 				searchCriteria.setSortBy("name");
 				vXUserListSort = xUserService.searchXUsers(searchCriteria);
@@ -1797,7 +1808,7 @@ public VXGroupList searchXGroups(SearchCriteria searchCriteria) {
 			if (userSession != null
 					&& userSession.getUserRoleList().size() == 1
 					&& userSession.getUserRoleList().contains(
-							RangerConstants.ROLE_USER)
+					RangerConstants.ROLE_USER)
 					&& userSession.getLoginId() != null) {
 				loggedInVXUser = xUserService.getXUserByUserName(userSession
 						.getLoginId());
@@ -1806,7 +1817,7 @@ public VXGroupList searchXGroups(SearchCriteria searchCriteria) {
 				}
 
 			}
-			
+
 			VXGroupList vXGroupListSort= new VXGroupList();
 			if(searchCriteria.getParamList() != null && searchCriteria.getParamList().get("name") != null){
 				searchCriteria.setSortBy("name");
@@ -1835,14 +1846,14 @@ public VXGroupList searchXGroups(SearchCriteria searchCriteria) {
 						//Its required because we need to filter groups for user role
 						case "userid":
 							if (loggedInVXUser != null) {
-									List<Long> listGroupId = daoManager
-											.getXXGroupUser()
-											.findGroupIdListByUserId(loggedInVXUser.getId());
-									if (!listGroupId.contains(vXGroupExactMatch.getId())) {
-										vXGroupExactMatchwithSearchCriteria = -1;
-									}
+								List<Long> listGroupId = daoManager
+										.getXXGroupUser()
+										.findGroupIdListByUserId(loggedInVXUser.getId());
+								if (!listGroupId.contains(vXGroupExactMatch.getId())) {
+									vXGroupExactMatchwithSearchCriteria = -1;
+								}
 							}
-	
+
 							break;
 						default:
 							logger.warn("XUserMgr.searchXGroups: unexpected searchCriteriaParam:" + caseKey);
@@ -1853,7 +1864,7 @@ public VXGroupList searchXGroups(SearchCriteria searchCriteria) {
 					}
 				}
 			}
-			
+
 			if(vXGroupExactMatchwithSearchCriteria == 1){
 				List<VXGroup> vXGroups = new ArrayList<VXGroup>();
 				if(searchCriteria.getStartIndex() == 0){
@@ -1883,7 +1894,7 @@ public VXGroupList searchXGroups(SearchCriteria searchCriteria) {
 			}
 			vXGroupList=xGroupService.searchXGroups(searchCriteria);
 		}
-		
+
 		if(vXGroupList!=null && !hasAccessToModule(RangerConstants.MODULE_USER_GROUPS)){
 			if(vXGroupList!=null && vXGroupList.getListSize()>0){
 				List<VXGroup> listMasked=new ArrayList<VXGroup>();
@@ -1993,13 +2004,13 @@ public VXGroupList lookupXGroups(SearchCriteria searchCriteria) {
 	}
 
 	public Collection<String> getMaskedCollection(Collection<String> listunMasked){
-        List<String> listMasked=new ArrayList<String>();
-        if(listunMasked!=null) {
-            for(int i = 0; i < listunMasked.size(); i++) {
-                listMasked.add(AppConstants.Masked_String);
-            }
-        }
-        return listMasked;
+		List<String> listMasked=new ArrayList<String>();
+		if(listunMasked!=null) {
+			for(int i = 0; i < listunMasked.size(); i++) {
+				listMasked.add(AppConstants.Masked_String);
+			}
+		}
+		return listMasked;
 	}
 
 	public boolean hasAccessToModule(String moduleName){
@@ -2019,7 +2030,7 @@ public boolean hasAccessToModule(String moduleName){
 	public void deleteXGroup(Long id, boolean force) {
 		checkAdminAccess();
 		blockIfZoneGroup(id);
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		XXGroupDao xXGroupDao = daoManager.getXXGroup();
 		XXGroup xXGroup = xXGroupDao.getById(id);
 		VXGroup vXGroup = xGroupService.populateViewBean(xXGroup);
@@ -2186,14 +2197,14 @@ public void deleteXGroup(Long id, boolean force) {
 		}
 	}
 
-        private void blockIfZoneGroup(Long grpId) {
+	private void blockIfZoneGroup(Long grpId) {
 		List<XXSecurityZoneRefGroup> zoneRefGrpList = daoManager.getXXSecurityZoneRefGroup().findByGroupId(grpId);
 		if (CollectionUtils.isNotEmpty(zoneRefGrpList)) {
 			StringBuilder zones = new StringBuilder();
 			for(XXSecurityZoneRefGroup zoneRefGrp : zoneRefGrpList) {
 				XXSecurityZone xSecZone=daoManager.getXXSecurityZoneDao().getById(zoneRefGrp.getZoneId());
 				if(zones.indexOf(xSecZone.getName())<0)
-				zones.append(", " + xSecZone.getName());
+					zones.append(", " + xSecZone.getName());
 			}
 			logger.info("Can Not Delete Group :" + zoneRefGrpList.get(0).getGroupName() + "' as its already present in Zone " +zones);
 			VXResponse vXResponse = new VXResponse();
@@ -2202,11 +2213,11 @@ private void blockIfZoneGroup(Long grpId) {
 					"Can Not Delete Group '" + zoneRefGrpList.get(0).getGroupName() + "' as its already present in Zone " +zones);
 			throw restErrorUtil.generateRESTException(vXResponse);
 		}
-		}
+	}
 
-		public synchronized void deleteXUser(Long id, boolean force) {
+	public synchronized void deleteXUser(Long id, boolean force) {
 		checkAdminAccess();
-                xaBizUtil.blockAuditorRoleUser();
+		xaBizUtil.blockAuditorRoleUser();
 		XXUserDao xXUserDao = daoManager.getXXUser();
 		XXUser xXUser =	xXUserDao.getById(id);
 		VXUser vXUser =	xUserService.populateViewBean(xXUser);
@@ -2398,7 +2409,7 @@ private void blockIfZoneUser(Long id) {
 			for(XXSecurityZoneRefUser zoneRefUser :zoneRefUserList ) {
 				XXSecurityZone xSecZone = daoManager.getXXSecurityZoneDao().getById(zoneRefUser.getZoneId());
 				if(zones.indexOf(xSecZone.getName())<0)
-				zones.append(", " + xSecZone.getName());
+					zones.append(", " + xSecZone.getName());
 			}
 			logger.info("Can Not Delete User :" + zoneRefUserList.get(0).getUserName());
 			VXResponse vXResponse = new VXResponse();
@@ -2407,7 +2418,7 @@ private void blockIfZoneUser(Long id) {
 					"Can Not Delete User '"+ zoneRefUserList.get(0).getUserName() +"' as its already present in Zone" + zones);
 			throw restErrorUtil.generateRESTException(vXResponse);
 		}
-		}
+	}
 
 	private <T extends RangerPolicyItem> void removeUserGroupReferences(List<T> policyItems, String user, String group) {
 		List<T> itemsToRemove = null;
@@ -2478,18 +2489,45 @@ public VXUser createServiceConfigUser(String userName){
 			actualPassword = vXUser.getPassword();
 		}
 		if(xXPortalUser==null){
-			vXPortalUser=new VXPortalUser();
-			vXPortalUser.setLoginId(userName);
-			vXPortalUser.setEmailAddress(vXUser.getEmailAddress());
-			vXPortalUser.setFirstName(vXUser.getFirstName());
-			vXPortalUser.setLastName(vXUser.getLastName());
-			vXPortalUser.setPassword(vXUser.getPassword());
-			vXPortalUser.setUserSource(RangerCommonEnums.USER_EXTERNAL);
-			ArrayList<String> roleList = new ArrayList<String>();
-			roleList.add(RangerConstants.ROLE_USER);
-			vXPortalUser.setUserRoleList(roleList);
-			xXPortalUser = userMgr.mapVXPortalUserToXXPortalUser(vXPortalUser);
-			xXPortalUser=userMgr.createUser(xXPortalUser, RangerCommonEnums.STATUS_ENABLED, roleList);
+            int noOfRetries = 0;
+			do {
+			    try {
+                    TransactionTemplate txTemplate = new TransactionTemplate(txManager);
+                    txTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
+                    noOfRetries++;
+					final VXUser vxUserFinal = vXUser;
+                    xXPortalUser = txTemplate.execute(new TransactionCallback<XXPortalUser>() {
+                        @Override
+                        public XXPortalUser doInTransaction(TransactionStatus status) {
+                            XXPortalUser ret = daoManager.getXXPortalUser().findByLoginId(userName);
+                            if (ret == null) {
+								if (logger.isDebugEnabled()) {
+									logger.debug("createServiceConfigUser(): Couldn't find " + userName + " and hence creating user in x_portal_user table");
+								}
+								VXPortalUser vXPortalUser=new VXPortalUser();
+								vXPortalUser.setLoginId(userName);
+								vXPortalUser.setEmailAddress(vxUserFinal.getEmailAddress());
+								vXPortalUser.setFirstName(vxUserFinal.getFirstName());
+								vXPortalUser.setLastName(vxUserFinal.getLastName());
+								vXPortalUser.setPassword(vxUserFinal.getPassword());
+								vXPortalUser.setUserSource(RangerCommonEnums.USER_EXTERNAL);
+								ArrayList<String> roleList = new ArrayList<String>();
+								roleList.add(RangerConstants.ROLE_USER);
+								vXPortalUser.setUserRoleList(roleList);
+								ret = userMgr.mapVXPortalUserToXXPortalUser(vXPortalUser);
+                                ret = userMgr.createUser(ret, RangerCommonEnums.STATUS_ENABLED, roleList);
+                                if (logger.isDebugEnabled()) {
+                                        logger.debug("createServiceConfigUser(): Successfully created user in x_portal_user table " + ret.getLoginId());
+                                }
+                            }
+                           return ret;
+                        }
+                    });
+                } catch (Exception excp) {
+                    logger.warn("createServiceConfigUser(): Failed to update x_portal_user table and retry count =  " + noOfRetries);
+                    xXPortalUser = null;
+                }
+            } while (noOfRetries < MAX_DB_TRANSACTION_RETRIES && (xXPortalUser == null));
 		}
 		VXUser createdXUser=null;
 		if (xxUser == null && vXUser != null) {
@@ -2521,33 +2559,33 @@ public VXUser createServiceConfigUser(String userName){
 			}
 		}
 		return createdXUser;
-        }
-        protected void validatePassword(VXUser vXUser) {
-                if (vXUser.getPassword() != null && !vXUser.getPassword().isEmpty()) {
-                        boolean checkPassword = false;
-                        String pattern = "(?=.*[0-9])(?=.*[a-zA-Z]).{8,}";
-                        checkPassword = vXUser.getPassword().trim().matches(pattern);
-                        if (!checkPassword) {
-                                logger.warn("validatePassword(). Password should be minimum 8 characters with min one alphabet and one numeric.");
-                                throw restErrorUtil.createRESTException("serverMsg.xuserMgrValidatePassword", MessageEnums.INVALID_PASSWORD, null, "Password should be minimum 8 characters with min one alphabet and one numeric", null);
-                        }
-                } else {
-                        logger.warn("validatePassword(). Password cannot be blank/null.");
-                        throw restErrorUtil.createRESTException("serverMsg.xuserMgrValidatePassword", MessageEnums.INVALID_PASSWORD, null, "Password cannot be blank/null", null);
-                }
-        }
+	}
+	protected void validatePassword(VXUser vXUser) {
+		if (vXUser.getPassword() != null && !vXUser.getPassword().isEmpty()) {
+			boolean checkPassword = false;
+			String pattern = "(?=.*[0-9])(?=.*[a-zA-Z]).{8,}";
+			checkPassword = vXUser.getPassword().trim().matches(pattern);
+			if (!checkPassword) {
+				logger.warn("validatePassword(). Password should be minimum 8 characters with min one alphabet and one numeric.");
+				throw restErrorUtil.createRESTException("serverMsg.xuserMgrValidatePassword", MessageEnums.INVALID_PASSWORD, null, "Password should be minimum 8 characters with min one alphabet and one numeric", null);
+			}
+		} else {
+			logger.warn("validatePassword(). Password cannot be blank/null.");
+			throw restErrorUtil.createRESTException("serverMsg.xuserMgrValidatePassword", MessageEnums.INVALID_PASSWORD, null, "Password cannot be blank/null", null);
+		}
+	}
 
-        public void denySelfRoleChange(String userName) {
-            UserSessionBase session = ContextUtil.getCurrentUserSession();
-            if (session != null && session.getXXPortalUser()!=null) {
-                if (userName.equals(session.getXXPortalUser().getLoginId())) {
-                    throw restErrorUtil.create403RESTException("Permission"
-                            + " denied. LoggedInUser="
-                            + (session != null ? session.getXXPortalUser().getId()
-                                    : "Not Logged In")
-                            + " ,isn't permitted to change its own role.");
-                }
-            }
+	public void denySelfRoleChange(String userName) {
+		UserSessionBase session = ContextUtil.getCurrentUserSession();
+		if (session != null && session.getXXPortalUser()!=null) {
+			if (userName.equals(session.getXXPortalUser().getLoginId())) {
+				throw restErrorUtil.create403RESTException("Permission"
+						+ " denied. LoggedInUser="
+						+ (session != null ? session.getXXPortalUser().getId()
+						: "Not Logged In")
+						+ " ,isn't permitted to change its own role.");
+			}
+		}
 	}
 
 	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
@@ -2594,8 +2632,10 @@ public RangerUserStore getRangerUserStore(Long lastKnownUserStoreVersion) throws
 		return ret;
 	}
 
-	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
 	public int createOrUpdateXUsers(VXUserList users) {
+		if (logger.isDebugEnabled()) {
+			logger.debug("==> createOrUpdateXUsers(): Started");
+		}
 		xaBizUtil.blockAuditorRoleUser();
 		int ret = 0;
 
@@ -2607,84 +2647,151 @@ public int createOrUpdateXUsers(VXUserList users) {
 						+ "username.", MessageEnums.INVALID_INPUT_DATA);
 			}
 			checkAccess(vXUser.getName());
-
-			String username = vXUser.getName();
-			VXPortalUser vXPortalUser = userMgr.getUserProfileByLoginId(username);
-			if (vXPortalUser == null) {
-				vXPortalUser = new VXPortalUser();
-				vXPortalUser.setLoginId(username);
-				vXPortalUser.setFirstName(vXUser.getFirstName());
-				if ("null".equalsIgnoreCase(vXPortalUser.getFirstName())) {
-					vXPortalUser.setFirstName("");
-				}
-				vXPortalUser.setLastName(vXUser.getLastName());
-				if ("null".equalsIgnoreCase(vXPortalUser.getLastName())) {
-					vXPortalUser.setLastName("");
-				}
-
-				String emailAddress = vXUser.getEmailAddress();
-				if (StringUtils.isNotEmpty(emailAddress) && !stringUtil.validateEmail(emailAddress)) {
-					logger.warn("Invalid email address:" + emailAddress);
-					throw restErrorUtil.createRESTException("Please provide valid email address.",
-							MessageEnums.INVALID_INPUT_DATA);
-				}
-				vXPortalUser.setEmailAddress(emailAddress);
-
-				if (vXPortalUser.getFirstName() != null
-						&& vXPortalUser.getLastName() != null
-						&& !vXPortalUser.getFirstName().trim().isEmpty()
-						&& !vXPortalUser.getLastName().trim().isEmpty()) {
-					vXPortalUser.setPublicScreenName(vXPortalUser.getFirstName() + " "
-							+ vXPortalUser.getLastName());
-				} else {
-					vXPortalUser.setPublicScreenName(vXUser.getName());
-				}
-
-				vXPortalUser.setStatus(RangerCommonEnums.STATUS_ENABLED);
-				vXPortalUser.setUserSource(RangerCommonEnums.USER_EXTERNAL);
-				String saltEncodedpasswd = userMgr.encrypt(username,
-						vXUser.getPassword());
-				vXPortalUser.setPassword(saltEncodedpasswd);
-				vXPortalUser.setUserRoleList(vXUser.getUserRoleList());
-				XXPortalUser user = userMgr.mapVXPortalUserToXXPortalUser(vXPortalUser);
-
-				user = daoManager.getXXPortalUser().create(user);
-
-				// Create the UserRole for this user
-				Collection<String> userRoleList = vXUser.getUserRoleList();
-				if (userRoleList != null) {
-					for (String userRole : userRoleList) {
-						userMgr.addUserRole(user.getId(),
-								userRole);
+			TransactionTemplate txTemplate = new TransactionTemplate(txManager);
+			try {
+				txTemplate.execute(new TransactionCallback<Object>() {
+					@Override
+					public Object doInTransaction(TransactionStatus status) {
+						String username = vXUser.getName();
+						VXPortalUser vXPortalUser = userMgr.getUserProfileByLoginId(username);
+						if (vXPortalUser == null) {
+							if (logger.isDebugEnabled()) {
+								logger.debug("create user " + username);
+							}
+							createXUser(vXUser, username);
+						} else {
+							if (logger.isDebugEnabled()) {
+								logger.debug("Update user " + username);
+							}
+							updateXUser(vXUser, vXPortalUser);
+						}
+						return null;
 					}
-				}
-
-				vXUser = xUserService.createResource(vXUser);
-				List<XXTrxLog> trxLogList = xUserService.getTransactionLog(
-						vXUser, "create");
-
-				if (vXPortalUser != null) {
-					assignPermissionToUser(vXPortalUser.getUserRoleList(), vXPortalUser.getId(), vXUser.getId(), true);
-				}
-				xaBizUtil.createTrxLog(trxLogList);
-			} else {
-				if (logger.isDebugEnabled()) {
-					logger.debug("Update user " + username);
-				}
-				updateXUser(vXUser, vXPortalUser);
+				});
+			} catch (Throwable ex) {
+				logger.error("XUserMgr.createOrUpdateXUsers(): Failed to update DB for users: ", ex);
+				throw restErrorUtil.createRESTException("Failed to create or update users ",
+						MessageEnums.ERROR_CREATING_OBJECT);
 			}
 			ret++;
 		}
 
+		if (ret == 0) {
+			if (logger.isDebugEnabled()) {
+				logger.debug("<== createOrUpdateXUsers(): No users created or updated");
+			}
+
+			return ret;
+		}
+
+		TransactionTemplate txTemplate = new TransactionTemplate(txManager);
+
 		try {
-			daoManager.getXXGlobalState().onGlobalAppDataChange(RANGER_USER_GROUP_GLOBAL_STATE_NAME);
-		} catch (Exception excp) {
-			logger.error("createOrUpdateXGroups() failed", excp);
+			txTemplate.execute(new TransactionCallback<Void>() {
+				@Override
+				public Void doInTransaction(TransactionStatus status) {
+					int noOfRetries = 0;
+					Exception failureException = null;
+					do {
+						noOfRetries++;
+						try {
+							daoManager.getXXGlobalState().onGlobalAppDataChange(RANGER_USER_GROUP_GLOBAL_STATE_NAME);
+							if (logger.isDebugEnabled()) {
+								logger.debug("createOrUpdateXGroups(): Successfully updated x_ranger_global_state table");
+							}
+							return null;
+						} catch (Exception excp) {
+							logger.warn("createOrUpdateXGroups(): Failed to update x_ranger_global_state table and retry count =  " + noOfRetries);
+							failureException = excp;
+						}
+					} while (noOfRetries <= MAX_DB_TRANSACTION_RETRIES);
+					logger.error("createOrUpdateXGroups(): Failed to update x_ranger_global_state table after max retries", failureException);
+					throw new RuntimeException(failureException);
+				}
+			});
+		} catch (Throwable ex) {
+			logger.error("XUserMgr.createOrUpdateXUsers(): Failed to update DB for GlobalState table ", ex);
+			throw restErrorUtil.createRESTException("Failed to create or update users ",
+					MessageEnums.ERROR_CREATING_OBJECT);
+		}
+		if (logger.isDebugEnabled()) {
+			logger.debug("<== createOrUpdateXUsers(): Done");
 		}
 
 		return ret;
 	}
 
+	private void createXUser(VXUser vXUser, String username) {
+		if (logger.isDebugEnabled()) {
+			logger.debug("Creating user: " + username);
+		}
+		VXPortalUser vXPortalUser = new VXPortalUser();
+		vXPortalUser.setLoginId(username);
+		vXPortalUser.setFirstName(vXUser.getFirstName());
+		if ("null".equalsIgnoreCase(vXPortalUser.getFirstName())) {
+			vXPortalUser.setFirstName("");
+		}
+		vXPortalUser.setLastName(vXUser.getLastName());
+		if ("null".equalsIgnoreCase(vXPortalUser.getLastName())) {
+			vXPortalUser.setLastName("");
+		}
+
+		String emailAddress = vXUser.getEmailAddress();
+		if (StringUtils.isNotEmpty(emailAddress) && !stringUtil.validateEmail(emailAddress)) {
+			logger.warn("Invalid email address:" + emailAddress);
+			throw restErrorUtil.createRESTException("Please provide valid email address.",
+					MessageEnums.INVALID_INPUT_DATA);
+		}
+		vXPortalUser.setEmailAddress(emailAddress);
+
+		if (vXPortalUser.getFirstName() != null
+				&& vXPortalUser.getLastName() != null
+				&& !vXPortalUser.getFirstName().trim().isEmpty()
+				&& !vXPortalUser.getLastName().trim().isEmpty()) {
+			vXPortalUser.setPublicScreenName(vXPortalUser.getFirstName() + " "
+					+ vXPortalUser.getLastName());
+		} else {
+			vXPortalUser.setPublicScreenName(vXUser.getName());
+		}
+
+		vXPortalUser.setStatus(RangerCommonEnums.STATUS_ENABLED);
+		vXPortalUser.setUserSource(RangerCommonEnums.USER_EXTERNAL);
+		String saltEncodedpasswd = userMgr.encrypt(username,
+				vXUser.getPassword());
+		vXPortalUser.setPassword(saltEncodedpasswd);
+		vXPortalUser.setUserRoleList(vXUser.getUserRoleList());
+		XXPortalUser user = userMgr.mapVXPortalUserToXXPortalUser(vXPortalUser);
+
+		user = daoManager.getXXPortalUser().create(user);
+
+		// Create the UserRole for this user
+		Collection<String> userRoleList = vXUser.getUserRoleList();
+		if (userRoleList != null) {
+			for (String userRole : userRoleList) {
+				userMgr.addUserRole(user.getId(),
+						userRole);
+			}
+		}
+
+		XXUser xUser = daoManager.getXXUser().findByUserName(vXUser.getName());
+		if (xUser == null) {
+			vXUser = xUserService.createResource(vXUser);
+		} else {
+			vXUser = xUserService.populateViewBean(xUser);
+		}
+
+		List<XXTrxLog> trxLogList = xUserService.getTransactionLog(
+				vXUser, "create");
+
+		if (vXPortalUser != null) {
+			assignPermissionToUser(vXPortalUser.getUserRoleList(), vXPortalUser.getId(), vXUser.getId(), true);
+		}
+		xaBizUtil.createTrxLog(trxLogList);
+		if (logger.isDebugEnabled()) {
+			logger.debug("Done creating user: " + username);
+		}
+	}
+
 	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
 	public int createOrUpdateXGroups(VXGroupList groups) {
 		for (VXGroup vXGroup : groups.getList()) {
@@ -2877,6 +2984,9 @@ private void createOrUpdateUserPermisson(Long portalUserId, Long xUserId, Long m
 	}
 
 	private VXUser updateXUser(VXUser vXUser, VXPortalUser oldUserProfile) {
+		if (logger.isDebugEnabled()) {
+			logger.debug("Updating user: " + vXUser.getName());
+		}
 		VXPortalUser vXPortalUser = new VXPortalUser();
 		if (oldUserProfile != null && oldUserProfile.getId() != null) {
 			vXPortalUser.setId(oldUserProfile.getId());
@@ -2994,6 +3104,10 @@ else if (oldUserProfile.getUserSource() == RangerCommonEnums.USER_EXTERNAL) {
 
 		xaBizUtil.createTrxLog(trxLogList);
 
+		if (logger.isDebugEnabled()) {
+			logger.debug("Done updating user: " + vXUser.getName());
+		}
+
 		return vXUser;
 	}
 
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java b/security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java
index 8fae634..739809c 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java
@@ -1379,6 +1379,7 @@ public Map<String, Set<String>> getAllGroupUsers() {
 	@Path("/ugsync/users")
 	@Produces({ "application/xml", "application/json" })
 	@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
+	@Transactional(readOnly = false, propagation = Propagation.NOT_SUPPORTED)
 	public String addOrUpdateUsers(VXUserList users) {
 		int ret = xUserMgr.createOrUpdateXUsers(users);
 		return String.valueOf(ret);
diff --git a/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java b/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java
index a76a484..cfd66b1 100644
--- a/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java
+++ b/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java
@@ -2053,12 +2053,7 @@ public void test49createServiceConfigUser() {
 		Mockito.when(daoManager.getXXPortalUser()).thenReturn(userDao);
 		Mockito.when(userDao.findByLoginId(vxUser.getName())).thenReturn(null);
 		Mockito.when(userDao.findByLoginId(vxUser.getName())).thenReturn(null);
-		Mockito.when(userMgr.mapVXPortalUserToXXPortalUser((VXPortalUser) Mockito.any())).thenReturn(xXPortalUser);
-		Mockito.when(userMgr.createUser(xXPortalUser,RangerCommonEnums.STATUS_ENABLED,userRoleList)).thenReturn(xXPortalUser);
 		Mockito.when(xUserService.createResource((VXUser) Mockito.any())).thenReturn(vxUser);
-		Mockito.when(userMgr.mapXXPortalUserToVXPortalUserForDefaultAccount((XXPortalUser) Mockito.any())).thenReturn(userProfile);
-		Mockito.when(daoManager.getXXModuleDef()).thenReturn(xXModuleDefDao);
-		Mockito.when(xXModuleDefDao.getAll()).thenReturn(xXModuleDefs);
 		Mockito.when(daoManager.getXXUser()).thenReturn(xxUserDao);
 		UserSessionBase userSession = Mockito.mock(UserSessionBase.class);
 		Set<UserSessionBase> userSessions = new HashSet<UserSessionBase>();
@@ -3216,8 +3211,6 @@ public void test99createServiceConfigUser() {
 		Mockito.when(xxUserDao.findByUserName(vxUser.getName())).thenReturn(null);
 		Mockito.when(daoManager.getXXPortalUser()).thenReturn(userDao);
 		Mockito.when(userDao.findByLoginId(vxUser.getName())).thenReturn(null);
-		Mockito.when(userMgr.mapVXPortalUserToXXPortalUser((VXPortalUser) Mockito.any())).thenReturn(xXPortalUser);
-		Mockito.when(userMgr.createUser(xXPortalUser,RangerCommonEnums.STATUS_ENABLED,userRoleList)).thenReturn(xXPortalUser);
 		Mockito.when(xUserService.createResource((VXUser) Mockito.any())).thenReturn(null);
 		Mockito.when(daoManager.getXXUser()).thenReturn(xxUserDao);
 		UserSessionBase userSession = Mockito.mock(UserSessionBase.class);