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; } } } }