Apex fflib_SObjectUnitOfWork SimpleDML UNABLE_TO_LOCK_ROW nested try catch

UNABLE_TO_LOCK_ROW issue is very common if you have multiple users updating the record at the same time .Or say a batch job is running and is updating a record and same record another trigger or code snippet (usually a future method) is updating. A way to solve this is to retry multiple times to see if the record has been unlocked for update.

Multi-try will try update 3 times before throwing and error

public class SimpleDML implements IDML
{
	public void dmlUpdate(List<SObject> objList){
		try {
			update objList;
		} catch (System.DMLException ex1){
			if (StatusCode.UNABLE_TO_LOCK_ROW==ex1.getDmlType(0)){
				try{
					update objList;
				} catch (System.DMLException ex2) {
					if (StatusCode.UNABLE_TO_LOCK_ROW==ex2.getDmlType(0)){
						update objList;
					} else {
						throw ex2;
					}
				}
			} else {
				throw ex1;
			}
		}
	}
}

Catch Apex Callout Loop not Allowed

Getting the following error: Apex Callout Loop not Allowed when you are doing a callout to the same Salesforce org and then calling out to another external service.

In this case I was doing a callout to the same salesforce org and then doing a callout to the my logging service.

RestRequest request = RestContext.request;
Map requestHeaders = request.headers;
if (requestHeaders.containsKey('Sfdc-Stack-Depth') && '1'.equals(requestHeaders.get('Sfdc-Stack-Depth'))){
      System.debug('Do not calllout as it will cause a callout loop error');
} 

Further you can write these values to a custom object and have a scheduler or workflow run to do the callout.