1

I have a question on above mentioned subject.

If I am having an apex trigger A1 on X__c custom object. Once there is an update on X__c record , trigger fires. Now when trigger is running by that time a Workflow fires causing to update on same record which in turn cause another instance of A1 trigger to fire.

Will the above scenario cause a deadlock on the record or fail any of the events to fail to update?

  • 1
    Tried to fix grammar, but gave up because I really don't understand the question. Why do people put spaces before punctuation marks? It's so obviously wrong. – TRiG Sep 10 '15 at 9:29
1

In salesforce, it's not like another thread owned by you is accessing the records in another database session.

As all the operations that occur on the records in scope are in the same context, your execution, Salesforce knows that

  • you have the lock

  • your nested instance of the trigger is your user

  • in your execution

  • running on the same records that you've already locked

so it doesn't cause a deadlock.

Salesforce executions are single threaded and follow a strict order. As the operations happen in series they don't contend with other operations caused by the same execution, as the same set of records are being pushed through the execution.

There's an explanation of the order here, and it's quoted below.

On the server, Salesforce:

  1. Loads the original record from the database or initializes the record for an upsert statement.
  2. Loads the new record field values from the request and overwrites the old values. If the request came from a standard UI edit page, Salesforce runs system validation to check the record for: Compliance with layout-specific rules Required values at the layout level and field-definition level Valid field formats Maximum field length Salesforce doesn't perform system validation in this step when the request comes from other sources, such as an Apex application or a SOAP API call. Salesforce runs user-defined validation rules if multiline items were created, such as quote line items and opportunity line items.
  3. Executes all before triggers.
  4. Runs most system validation steps again, such as verifying that all required fields have a non-null value, and runs any user-defined validation rules. The only system validation that Salesforce doesn't run a second time (when the request comes from a standard UI edit page) is the enforcement of layout-specific rules.
  5. Executes duplicate rules. If the duplicate rule identifies the record as a duplicate and uses the block action, the record is not saved and no further steps, such as after triggers and workflow rules, are taken.
  6. Saves the record to the database, but doesn't commit yet.
  7. Executes all after triggers.
  8. Executes assignment rules.
  9. Executes auto-response rules.
  10. Executes workflow rules.
  11. If there are workflow field updates, updates the record again.
  12. If the record was updated with workflow field updates, fires before update triggers and after update triggers one more time (and only one more time), in addition to standard validations. Custom validation rules and duplicate rules are not run again.
  13. Executes processes.
  14. If there are workflow flow triggers, executes the flows.

    The Process Builder has superseded flow trigger workflow actions, formerly available in a pilot program. Organizations that are using flow trigger workflow actions can continue to create and edit them, but flow trigger workflow actions aren’t available for new organizations. For information on enabling the Process Builder in your organization, contact Salesforce.

  15. Executes escalation rules.
  16. Executes entitlement rules.
  17. If the record contains a roll-up summary field or is part of a cross-object workflow, performs calculations and updates the roll-up summary field in the parent record. Parent record goes through save procedure.
  18. If the parent record is updated, and a grandparent record contains a roll-up summary field or is part of a cross-object workflow, performs calculations and updates the roll-up summary field in the grandparent record. Grandparent record goes through save procedure.
  19. Executes Criteria Based Sharing evaluation.
  20. Commits all DML operations to the database.
  21. Executes post-commit logic, such as sending email.
2

This is a general apex trigger avoiding infinite loop question. The best practice to this is to use a good apex trigger framework. Like this one by Salesforce MVP Kevin Ohara: https://github.com/kevinohara80/sfdc-trigger-framework

But, if you simply want an easy solution to your current problem. Here is the design to ensure every trigger fires only once, unless intended to run multiple times.

In a separate util class, define a inXTrigger static variable and default it to false, like this:

public class Util {
    public static Boolean inXTrigger = false;
}

In your trigger:

if(inXTrigger) {
   return;
}

And in your After trigger, set inXTrigger to be true.

This will ensure your trigger only fire once per execution criteria.

  • This isn't about recursion per se, it's about whether nested execution of trigger can deadlock records by contending with its parent execution. Also, the pattern you recommend, though common, is more of an anti-pattern. The static var is reset per execution, not per trigger call. So if you try to update more than 200 records in a single DML call, only the first 200 records will get the trigger action. – Dominic Sep 10 '15 at 7:52

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.