hibernate事务回滚不起作用

时间:2017-06-27 09:22:47

标签: java spring hibernate

在我的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();
         }

         }
 }

1 个答案:

答案 0 :(得分:0)

看起来像是在创建两个不同的会话并且具有单独的提交操作。

要实现目标,您必须打开一个会话和一个事务,然后执行两个查询,并且只有在成功执行后才执行提交。

在这种情况下,如果任何查询执行失败,您将不会影响数据库状态。目前您已经提交了第一个查询,因此,如果您的第二个查询失败,则之前查询的更改将无法恢复。

Here is an example