I am doing some testing on Salesforce Transaction controls and noticed something odd. I was wondering if I am missing something or if I am just not following 'best practices'.

System.Savepoint sp = Database.setSavepoint();
SomeClass.someMethod(string jsonString) //Method parses a large JSON string and inserts/updates and deletes data
}catch(Exception ex){

I have updated that 'someMethod' above to throw different SOQL, DML, CPU errors and they after modifying data and it does not successfully rollback. However simple divide by 0 and explicit exceptions rollback successfully.

Overall my question is when using Salesforce's Database savepoints and rollbacks and a limit error is encountered, does the transaction successfully rollback or does the transaction stop and leave the DB where it stands?

  • 1
    When an exception is thrown, it "should" rollback the entire transaction, not just to the rollback point. However that could depend on the type of exception as it's possible the exception could prevent recovery. – crmprogdev Dec 15 '16 at 13:13
  • I opened a case with Salesforce and based on what I have heard so far it sounds like Governor Limit exceptions are not catchable so you cannot handle the rollback. Their suggestion is the same as yours where you have to monitor your limits and throw and terminate/rollback when you are getting close. – RussellLMiller Dec 22 '16 at 18:13

From the Apex Docs under Transaction Control:

Each rollback counts against the governor limit for DML statements. You will receive a runtime error if you try to rollback the database additional times.

I would take this to mean that the rollback will fail if you reach a DML limit exception.

  • That makes sense for DML limits however if I induce a SOQL limit (101 Queries) this also doesn't roll back successfully. Since I still have some DML bandwidth in this method I would assume that it would still rollback, but it doesn't appear to do so. – RussellLMiller Dec 15 '16 at 14:01
  • There's are limits class methods that I recommend you implement in your code before trying to use rollbacks. That's something one normally does when using any feature on the platform that can fail because of exceeding limits. If query limits are causing issues for you, then you clearly need to be using getlimitQueries() and getQueries() in your code. – crmprogdev Dec 15 '16 at 14:10

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.