我想在函数中回滚一个事务,比如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)
功能。 请帮忙。
答案 0 :(得分:0)
你可以让事务Abc()返回一个布尔值,说明它是否必须自行回滚,然后在xyz()中使用该布尔值来确定是否回滚它。
答案 1 :(得分:0)
解决此问题的最佳方法是不在abc()中使用新事务。在xyz中启动事务并使用abc()中所需的事务prorogation。这样,在abc()中的Tx将在xxz()开始的Tx上运行,如果abc抛出异常,则捕获它并回滚Tx,以便Xyz中的Tx也回滚。你在使用Spring吗?如果没有,那么Spring应该使用注释很容易地解决这些情况。