在调用另一个函数的函数中回滚事务

时间:2014-12-11 05:52:48

标签: java java-ee rollback

我想在函数中回滚一个事务,比如xyz()

这个xyz调用另一个函数,说abc()在其中有自己的事务tx。如果由于异常Abc()回滚其事务,因此xyz()中的事务也应该回滚。 如何在xyz()中回滚事务?

这是我的代码。

public String execute() throws Exception {
        //  viewReadOnly();
        Session sf=null;
         Transaction tx=null;

        try {
              sf = HibernateUtil.getSessionFactory().getCurrentSession();
              tx = sf.getTransaction();

             tx.begin();

            //sosFile.setCmaId(1);
            //sosFile.setSosFileId(1);
            //sosFile.setHeadImage(new ImageService().readImageOldWay(headFile));
            //sosFile.setFootImage(new ImageService().readImageOldWay(footFile));

            //if(new ImageService().readImageOldWay(headFile) != null)

           System.out.println("FLAG="+flag);

          if(headFile!=null)
         {

           for (int i = 0; i < headFile.length; i++) {

            if (headFile != null) {
                sosOrder = new SOSCustomerOrderFile();
                sosOrder.setCmaId(cmaId);



                sosOrder.setFileData(new ImageService().readImageOldWay(headFile[i]));
                sosOrder.setFileName(new File(sosorderfilename[i]).getName());
                sosOrder.setSosStage(flag);

                sf.saveOrUpdate(sosOrder);
                }

           }
        }  
          if(footFile!=null)
          {

           for (int i = 0; i < footFile.length; i++) {

            if (footFile != null) {
                sosCheque.setCmaId(cmaId);
                sosCheque.setFileData(new ImageService().readImageOldWay(footFile[i]));
                sosCheque.setFileName(new File(soschequefilename[i]).getName());
                sosCheque.setSosStage(flag);

                sf.saveOrUpdate(sosCheque);

            }
           }
        }

         //   tx.begin();


         //   sf.close();
/*Session sf1 = HibernateUtil.getSessionFactory().getCurrentSession();
            Transaction tx1 = sf1.getTransaction();
             tx1.begin();*/

            if (cheque_no_hidden != null || cheque_amount_hidden != null || cheque_bank_hidden != null || cheque_date_hidden != null) {
                for (int i = 0; i < chequeCounter; i++) {



                    cheque_no = cheque_no_hidden.split(",");
                    cheque_amount = cheque_amount_hidden.split(",");
                    cheque_bank = cheque_bank_hidden.split(",");
                    cheque_date = cheque_date_hidden.split(",");

                    SOSChequeDetails sosChequeD = new SOSChequeDetails();
                    sosChequeD.setChequeNo(cheque_no[i]);
                    sosChequeD.setChequeAmount(cheque_amount[i]);
                    sosChequeD.setChequeBank(cheque_bank[i]);
                    sosChequeD.setChequeDate(cheque_date[i]);
                    sosChequeD.setCmaId(cmaId);
                    sosChequeD.setSosStage(flag);

                    sf.saveOrUpdate(sosChequeD);
               //     tx1.begin();


                 //   sf1.close();

                }

            }



 if(saveSOSValue.saveSOS(sosValues, cmaId,flag,sf,tx))
 {
     sosValues.setFlag(1);
 }
 else
 {
     sosValues.setFlag(2);
 }

 if(flag.equalsIgnoreCase("sosSUBMIT"))
 {
 CmaDetails  cmaD  = (CmaDetails) sf.get(CmaDetails.class, cmaId);

/* for(int j=0;j<5;j++){
     LeaveManagementManager manager=new LeaveManagementManager();
     Userinfo userinfoLeave=manager.getUserInfoObjforsos(sosWorkflow_status);

     workflow.setFromDesignation(userinfoLeave.getWorkflowdesignation().getWorkflowDesignationId());
     List<Workflow> workflowListTemp=new ArrayList<Workflow>();
     workflowListTemp=(new WorkflowService().performAction(workflow)); 

     if(userinfoLeave.getOutOfOffice()!=null && userinfoLeave.getOutOfOffice().equals("OOO")){
       date.setSeconds(date.getSeconds()+1);
       wfs=makeEntryInWorkflow(sdm,formater,now, date, workflowListTemp, cmaDetails, query, i, ToEmailIdTemp, ToEmailId,wfs,null);
     }else{
       j=5;
     }
     }*/

boolean decideRollback=approveSOSvalue.ApprovalSOSWorkflow(sosWorkflow_status,sosValues,cmaD,"create",1,"flag");  
if(decideRollback==false){
tx.rollback();

}
 }   
        } catch (Exception e) {
           if (tx!=null) tx.rollback();

           e.printStackTrace(); 
        }




        viewDocuments();
        viewCheques();
       /* ComplianceCMA complianceCMA = new ComplianceCMA();
        cmaDetails = complianceCMA.getCma(cmaId);
        cmaDetails.setStage(Constants.STAGE_SOS_UPLOAD);
        UpdateCMA updateStage = new UpdateCMA();
        updateStage.performAction(cmaDetails);*/


        ViewSOSDetails viewsos=new ViewSOSDetails();
        viewsos.home();
        return SUCCESS;
    }

此函数调用

public boolean ApprovalSOSWorkflow(SOSWorkflow_status sosWorkflowstatuscomment,SOSValues sosValues,CmaDetails cmaId,String Action,int bpaID,String flag)

功能。 请帮忙。

2 个答案:

答案 0 :(得分:0)

你可以让事务Abc()返回一个布尔值,说明它是否必须自行回滚,然后在xyz()中使用该布尔值来确定是否回滚它。

答案 1 :(得分:0)

解决此问题的最佳方法是不在abc()中使用新事务。在xyz中启动事务并使用abc()中所需的事务prorogation。这样,在abc()中的Tx将在xxz()开始的Tx上运行,如果abc抛出异常,则捕获它并回滚Tx,以便Xyz中的Tx也回滚。你在使用Spring吗?如果没有,那么Spring应该使用注释很容易地解决这些情况。