在我的dao上我有两个问题。如果第一个查询成功提交,那么第二个查询应该运行。但是如果第一个查询已提交但第二个查询以某种方式无法提交/得到一些异常,那么提交的第一个查询也应该回滚。我怎么能这样做?
@Repository
public class UpdatePaymentImpl implements UpdatePayment {
@Autowired
SessionFactory sessionFactory;
Session session;
Transaction trans;
@Override
public int updatePayment(@RequestBody UpdateParam updateParam) {
String totalFee=updateParam.getTotalFee();
// float amountPaid=Float.toString(updateParam.getAmountPaid());
String amountPaid=Double.toString(updateParam.getAmountPaid());
//System.out.println(amountPaid);
String depositSlioNo=updateParam.getDepositSlipNo();
String masterId= updateParam.getMasterId();
String advCode=updateParam.getAdvCode();
try{
session=sessionFactory.openSession();
trans=session.beginTransaction();
Query query= session.createQuery
("update CandidateappearagainstadvtcodeEntity cd set cd.paymentstatus='Completed',
cd.amountpaid=:depoFee,cd.challanid=:depositSlip where
cd.studentmasterid=:masterid and cd.advertisementcode=:advCode");
System.out.println(updateParam.getAdvCode());
query.setParameter("depoFee",amountPaid);
query.setParameter("depositSlip",depositSlioNo);
query.setParameter("masterid",masterId);
query.setParameter("advCode",advCode);
int result= query.executeUpdate();
trans.commit();
System.out.println("update successful");
if(result>0){
String masterId1= updateParam.getMasterId();
String advCode1=updateParam.getAdvCode();
Double amountpaid1=updateParam.getAmountPaid();
session = sessionFactory.openSession();
trans = session.beginTransaction();
Query query1 =session.createQuery(" update CandidateappeartoadvtnumberEntity
cnd set cnd.paymentstatus='Completed', cnd.depositedfee=:depofee where
cnd.studentmasterid=:masterid
and cnd.advertisementcode=:advcode");
query1.setParameter("depofee",amountpaid1);
query1.setParameter("masterid",masterId1);
query1.setParameter("advcode",advCode1);
int result1 = query1.executeUpdate();
trans.commit();
System.out.println("updated");
}
return result;
}catch (Exception e){
System.out.println("update error " +e);
trans.rollback();
return 0;
}finally {
session.close();
}
}
}
答案 0 :(得分:0)
看起来像是在创建两个不同的会话并且具有单独的提交操作。
要实现目标,您必须打开一个会话和一个事务,然后执行两个查询,并且只有在成功执行后才执行提交。
在这种情况下,如果任何查询执行失败,您将不会影响数据库状态。目前您已经提交了第一个查询,因此,如果您的第二个查询失败,则之前查询的更改将无法恢复。