function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Jayati AroraJayati Arora 

System.DmlException: Update failed.first error: UNABLE_TO_LOCK_ROW, unable to obtain exclusive access to this record: [] Trigger.addAttachmentNameInReport: line 115, column 1

Hi Guys,

Please help me out with above error which I am facing during bulk update. Below is the code mentioned:-

trigger addAttachmentNameInReport on Attachment (after delete, after insert, after undelete, after update){
   Set<ID> oppIdSet =new Set<id>();
    Set<ID> jobrefIdSet =new Set<id>();
    Set<ID> artworkIdSet =new Set<id>();
    Map<Id,Opportunity> oppMap ;
    Map<Id,Job_Reference__c> jobrefMap ;
    Map<Id,artApp__Artwork__c> artworkMap ;
    if(trigger.isInsert || trigger.isUpdate){
        for(Attachment a: Trigger.new){
            String objName = a.parentId.getSObjectType().getDescribe().getName();
            if(objName == 'Opportunity'){
                oppIdSet.add(a.parentid);
            }
            else if(objName== 'job_reference__c'){
                jobrefIdSet.add(a.parentid);
            }
            else if(objName== 'artApp__Artwork__c'){
                 artworkIdSet.add(a.parentid);
            }
        }
     }
     if(trigger.isdelete){
            for(Attachment a: Trigger.old){
                String objName = a.parentId.getSObjectType().getDescribe().getName();
                if(objName == 'Opportunity'){
                    oppIdSet.add(a.parentid);
                }
                else if(objName== 'job_reference__c'){
                    jobrefIdSet.add(a.parentid);
                }
                else if(objName== 'artApp__Artwork__c'){
                     artworkIdSet.add(a.parentid);
                }
            }
     }
       
    if(trigger.isInsert || trigger.isUpdate){
        if(oppIdSet.size() > 0 ){
            oppMap = new Map<Id,Opportunity>([select Id,Attachment__c from Opportunity where Id IN: oppIdSet]);
            if(oppMap.size() > 0 ){
                for(Attachment att : Trigger.new){
                    if(oppMap.get(att.parentId) != null){
                        if(oppMap.get(att.parentId).Attachment__c != null && oppMap.get(att.parentId).Attachment__c != ''){
                            if(Trigger.isInsert){
                                oppMap.get(att.parentId).Attachment__c += +'\n' +att.Name;
                            }
                            else if(Trigger.isUpdate){
                                system.debug('Updateeeee === ');
                                system.debug('$$$$$$'+ Trigger.oldMap.get(att.Id).Name);
                                system.debug('value of new name'+ att.Name);
                                if(Trigger.oldMap.get(att.Id).Name != att.Name && oppMap.get(att.parentId).Attachment__c.contains(Trigger.oldMap.get(att.Id).Name)){
                                    oppMap.get(att.parentId).Attachment__c = oppMap.get(att.parentId).Attachment__c.replaceFirst(Trigger.oldMap.get(att.Id).Name,att.Name);
                                    system.debug('Old Name=== '+Trigger.oldMap.get(att.Id).Name);
                                    system.debug('Assingd Name === '+oppMap.get(att.parentId).Attachment__c);
                                }
                            }
                        }
                        else{
                            oppMap.get(att.parentId).Attachment__c = att.Name;
                        }
                    }
                }
             update oppMap.values();
            }
        }
        if(jobrefIdSet.size()>0){
            jobrefMap = new Map<Id,job_reference__c>([select Id,Attachment__c from job_reference__c where Id IN: jobrefIdSet]);
            if(jobrefMap.size() > 0 ){
                for(Attachment att : Trigger.new){
                    if(jobrefMap.get(att.parentId) != null){
                        if(jobrefMap.get(att.parentId).Attachment__c != null && jobrefMap.get(att.parentId).Attachment__c != ''){
                            if(Trigger.isInsert){
                                jobrefMap.get(att.parentId).Attachment__c += +'\n' +att.Name;
                            }
                            else if(Trigger.isUpdate){
                                system.debug('Updateeeee === ');
                                if(Trigger.oldMap.get(att.Id).Name != att.Name && jobrefMap.get(att.parentId).Attachment__c.contains(Trigger.oldMap.get(att.Id).Name)){
                                    jobrefMap.get(att.parentId).Attachment__c = jobrefMap.get(att.parentId).Attachment__c.replaceFirst(Trigger.oldMap.get(att.Id).Name,att.Name);
                                    system.debug('Old Name=== '+Trigger.oldMap.get(att.Id).Name);
                                    system.debug('Assingd Name === '+jobrefMap.get(att.parentId).Attachment__c);
                                }
                            }
                        }
                        else{
                            jobrefMap.get(att.parentId).Attachment__c = att.Name;
                        }
                    }
                }
             update jobrefMap.values();
            }
        }
        if(artworkIdSet.size()>0){
            artworkMap = new Map<Id,artApp__Artwork__c>([select Id,Attachment__c from artApp__Artwork__c where Id IN: artworkIdSet]);
            if(artworkMap.size() > 0 ){
                for(Attachment att : Trigger.new){
                    if(artworkMap.get(att.parentId) != null){
                        if(artworkMap.get(att.parentId).Attachment__c != null && artworkMap.get(att.parentId).Attachment__c != ''){
                            if(Trigger.isInsert){
                                artworkMap.get(att.parentId).Attachment__c += +'\n' +att.Name;
                            }
                            else if(Trigger.isUpdate){
                                system.debug('Updateeeee === ');
                                if(Trigger.oldMap.get(att.Id).Name != att.Name && artworkMap.get(att.parentId).Attachment__c.contains(Trigger.oldMap.get(att.Id).Name)){
                                    artworkMap.get(att.parentId).Attachment__c = artworkMap.get(att.parentId).Attachment__c.replaceFirst(Trigger.oldMap.get(att.Id).Name,att.Name);
                                    system.debug('Old Name=== '+Trigger.oldMap.get(att.Id).Name);
                                    system.debug('Assingd Name === '+artworkMap.get(att.parentId).Attachment__c);
                                }
                            }
                        }
                        else{
                            artworkMap.get(att.parentId).Attachment__c = att.Name;
                        }
                    }
                }
             update artworkMap.values();
            }
        }
    }
    else if(Trigger.isDelete){
        if(oppIdSet.size() > 0 ){
        system.debug('Opp Size'+oppIdSet.size());
            oppMap = new Map<Id,Opportunity>([select Id,Attachment__c from Opportunity where Id IN: oppIdSet]);
            if(oppMap.size() > 0 ){
                for(Attachment att : Trigger.old){
                    if(oppMap.get(att.parentId).attachment__c != null && oppMap.get(att.parentId).attachment__c != '' && oppMap.get(att.parentId).Attachment__c.contains(Trigger.oldMap.get(att.Id).Name)){
                        oppMap.get(att.parentId).attachment__c = oppMap.get(att.parentId).attachment__c.replaceFirst(Trigger.oldMap.get(att.Id).Name,'');
                    }
                }
                    Update oppMap.values();
            }
        }
        if(jobrefIdSet.size()>0){
            jobrefMap = new Map<Id,job_reference__c>([select Id,Attachment__c from job_reference__c where Id IN: jobrefIdSet]);
            if(jobrefMap.size() > 0 ){
                for(Attachment att : Trigger.old){
                    if(jobrefMap.get(att.parentId).attachment__c != null && jobrefMap.get(att.parentId).attachment__c != '' && jobrefMap.get(att.parentId).Attachment__c.contains(Trigger.oldMap.get(att.Id).Name)){
                        jobrefMap.get(att.parentId).attachment__c = jobrefMap.get(att.parentId).attachment__c.replaceFirst(Trigger.oldMap.get(att.Id).Name,'');
                    }
                }
                    update jobrefMap.values();
            }
        }
        if(artworkIdSet.size()>0){
            artworkMap = new Map<Id,artApp__Artwork__c>([select Id,Attachment__c from artApp__Artwork__c where Id IN: artworkIdSet]);
            if(artworkMap.size() > 0 ){
                for(Attachment att : Trigger.old){
                    if(artworkMap.get(att.parentId).attachment__c != null && artworkMap.get(att.parentId).attachment__c != '' && artworkMap.get(att.parentId).Attachment__c.contains(Trigger.oldMap.get(att.Id).Name)){
                        artworkMap.get(att.parentId).attachment__c = artworkMap.get(att.parentId).attachment__c.replaceFirst(Trigger.oldMap.get(att.Id).Name,'');
                    }
                }
                    update artworkMap.values();
            }
        }
    }
}

praveen murugesanpraveen murugesan
Hi Jayati,

See this,

http://salesforce.stackexchange.com/questions/20921/can-anybody-explain-the-unable-to-lock-row-error

And there is some kind of recussion goin on like

1.)Trigger is calling another trigger which is trying to update same record
2.)batch is calling another trigger which is trying to update same record

So just check all your active actions and see if any 2 of them are clashing with each other

https://developer.salesforce.com/forums/ForumsMain?id=906F000000090tZIAQ


Mark this as best answer if its helps.

Thanks.
Jayati AroraJayati Arora

Hi Praveen

I have checked this link and also all associated triggers in my org. As you can see I am getting error on line 115 which is update artworkMap.values(). In art work I have no other trigger for update event, its only for delete event. However we do have for update trigger opportunity object.

So I think there i some other problem. Please try to help me.

Thanks,

Jayati