zoukankan      html  css  js  c++  java
  • Salesforce的Rollback与SavePoint

    之前对于Salesforce的RollBack机制没有进行深入的思考。
    那天,闲来无事,有人问了我一个问题。

    问说,下面的代码在匿名快执行完之后插进去了几条数据。

     1 ObjectA__c objA = new ObjectA__c();
     2 objA.Name = "TestA";
     3 insert objA;
     4 
     5 List<ObjectB__c> objBList = new List<ObjectB__c>
     6 for(Integer i = 0; i < 200; i++) {
     7     ObjectB__c objB = new ObjectB__c();
     8     objB.Name = "TestB" + i;
     9     insert ojbB;
    10 }

    我大概扫了一眼,问的是Governor Limit嘛,答案是150,送分题,不谢。
    但又隐约的觉得不大对劲,既然拿来问我,肯定有坑。
    立马打开Developer Console试了一下。
    看到了结果倒吸了一口冷气。。。。。。。。0,一条都没插进去。全都RollBack了?

    咦?不对啊,那一定是匿名块做了特殊的设置。试试Controller。
    要不然我以前在Controller里写个什么劲儿的SavePoint。
    VF:

    1 <apex:page controller="TestRollbackClass">
    2     <apex:form>
    3         <apex:commandButton action="{!save}" value="Button"/>  
    4     </apex:form>
    5 </apex:page>

    Apex Class:

     1 public class TestRollbackClass {
     2 
     3     public void save() {     
     4         ObjectA__c oa = new ObjectA__c();
     5         oa.Name = 'TestA';
     6         insert oa;
     7 
     8         ObjectB__c ob = new ObjectB__c();
     9         ob.Name = 'testB';
    10         insert ob;
    11     }
    12 }

    我在ObjectB上加了一个Validation Rule,保证新建ObjectB记录的一定会报错。
    这次总该如预期一般只有ObjectA被插进去了吧。

    结果一跑,唉? 还是都RollBack了?
    瞬间怀疑人生。既然都自动RollBack了,那我以前为什么必须写SavePoint?
    去翻了下Release Note,也没找到相关的变动。

    没办法,一定是写法问题,我试着按照Coding Standard写一次

     1 public class TestRollbackClass {
     2 
     3     public void save() {
     4     ObjectA__c oa = new ObjectA__c();
     5     oa.Name = 'Test2';
     6         insert oa;
     7         try {
     8             ObjectB__c ob = new ObjectB__c();
     9             ob.Name = 'test1';
    10             insert ob;
    11         } catch(Exception e) {
    12             ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Error, e.getMessage()));
    13         }
    14     }
    15 }

    再次执行,第一条数据ObjectA居然插进去了。
    我瞬间明白了点什么。

    Salesforce的机制应该是这样的,
    如果Transaction被异常中断,则Rollback全部的数据变动。
    如果异常被捕获,则已经正常commit的数据变动会落实。出错的部分无效。

    按照开发潜规则,应该展现给User更Friendly的错误信息,而不是可怕的Trace Log信息。
    所以我以前的公司要求捕获所有可能的异常并替换成友好的错误信息。
    这样的话,Transaction一定不会被异常中断,所以自动全部Rollback的机制从来没有启用过。
    那么为了防止在出错时插入脏数据,Salesforce提供了SavePoint。
    用法如下:

     1 public class TestRollbackClass {
     2 
     3     public void save() {
     4         SavePoint sp = Database.setSavepoint();
     5         ObjectA__c oa = new ObjectA__c();
     6         oa.Name = 'Test2';
     7         insert oa;
     8         try {
     9             ObjectB__c ob = new ObjectB__c();
    10             ob.Name = 'test1';
    11             insert ob;
    12         } catch(Exception e) {
    13             Database.rollback(sp);
    14             ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Error, e.getMessage()));
    15         }
    16     }
    17 }

    如果ObjectB插入出错,已insert的ObjectA也会回滚。达到目的。

    海外同步地址:https://wp.me/p3i9xe-f9

  • 相关阅读:
    SpringBoot整合Druid(阿里巴巴)数据源
    SpringBoot整合Jdbc
    SpringBoot使用外置的Servlet容器
    SpringBoot使用其他的Servlet容器
    question 002: dev c++ 当中如何调整字体大小?How to get the first program with C++? c++属于什么软件?
    c++ 程序设计question 001:我们的开发工具是什么?
    问题007:JDK版本与JRE版本不同导致java.exe执行类文件错误 java.lang.UnsupportedClassVersionError错误
    问题006:为什么用java.exe执行编译的类文件的时候,不这样写java Welcome.class
    问题005:如何配置JDK,Java运行环境?
    DOS当中的基本操作命令,如何切换磁盘,如何查看文件和文件夹,如何清屏,进入文件夹的命令,javac是什么意思,作用是什么?DOS如何建文件夹?退出文件夹?
  • 原文地址:https://www.cnblogs.com/sfdc/p/7840748.html
Copyright © 2011-2022 走看看