2014-08-27 54 views
0

請看看下面的代碼如何回滾數據一次插入到3個表中?

DBHandler.java

@Override 
    public String insertClient(String name, String address, String phone, String email, String country, Date visaGrantedDate, Date visaEntryDate) 
    { 
     int i=0; 
     try 
     { 
      con.setAutoCommit(false); 
      PreparedStatement ps = con.prepareStatement("insert into Client (Name, Address, Phone, Email, Country, Visa_Granted_Date, Visa_Entry_Date) values (?,?,?,?,?,?,?)"); 
      ps.setString(1,name); 
      ps.setString(2,address); 
      ps.setString(3,phone); 
      ps.setString(4, email); 
      ps.setString(5, country); 
      ps.setDate(6, visaGrantedDate); 
      ps.setDate(7, visaEntryDate); 

      i = ps.executeUpdate(); 
      con.commit(); 

      if(i>0) 
      { 
       return "Data saved successfully"; 
      } 
      else 
      { 
       return "Error in saving data"; 
      } 
     } 
     catch(SQLException e) 
     { 
      try 
      { 
       con.rollback(); 
       e.printStackTrace(); 
       return "Failed to save data. Data safely rolled back"; 
      } 
      catch(Exception ee) 
      { 
       ee.printStackTrace(); 
       return "Failed to save data. Data roll back failed"; 
      } 
     } 
    } 

    @Override 
    public String insertPortfolio(String portfolioID, String clientName, double amount, double dicn, String lawyer, String introducer, String provider, String Types) 
    { 
     int i=0; 
     try 
     { 
      con.setAutoCommit(false); 
      PreparedStatement ps = con.prepareStatement("insert into Portfolio (portfolio_id, Client_Name, Amount, riteria_Net, Lawyer, Introducer, Provider, Types) values (?,?,?,?,?,?,?,?)"); 
      ps.setString(1,portfolioID); 
      ps.setString(2,clientName); 
      ps.setDouble(3,amount); 
      ps.setDouble(4, dicn); 
      ps.setString(5, lawyer); 
      ps.setString(6, introducer); 
      ps.setString(7, provider); 
      ps.setString(8, Types); 

      i = ps.executeUpdate(); 
      con.commit(); 

      if(i>0) 
      { 
       return "Data saved successfully"; 
      } 
      else 
      { 
       return "Error in saving data"; 
      } 
     } 
     catch(SQLException e) 
     { 
      try 
      { 
       con.rollback(); 
       e.printStackTrace(); 
       return "Failed to save data. Data safely rolled back"; 
      } 
      catch(Exception ee) 
      { 
       ee.printStackTrace(); 
       return "Failed to save data. Data roll back failed"; 
      } 
     } 
    } 

    @Override 
    public String insertClientFees(String portfolioID, double initialFees, double initialStepnaFees, double initialIntraFees, double ongoingFees, double ongoingStepnaFees, double ongoingIntraFees, double ongoingFabulaFees, double Fees, double otherFees, double VAT) 
    { 
     int i=0; 
     try 
     { 
      con.setAutoCommit(false); 
      PreparedStatement ps = con.prepareStatement("insert into Client_Fees (portfolio_id, Initial_Fees, InitiaFees2, Initial_intra_Fees, Ongoing_Fees, Ongoing_octa_Fees, Ongoing_intra_Fees, Ongoing_fabula_Fees, Ongoing_stepna_Fees, Other, VAT) values (?,?,?,?,?,?,?,?,?,?,?)"); 
      ps.setString(1,portfolioID); 
      ps.setDouble(2,initialintraFees); 
      //Rest of the data insert code has been removed 


      i = ps.executeUpdate(); 
      con.commit(); 

      if(i>0) 
      { 
       return "Data saved successfully"; 
      } 
      else 
      { 
       return "Error in saving data"; 
      } 
     } 
     catch(SQLException e) 
     { 
      try 
      { 
       con.rollback(); 
       e.printStackTrace(); 
       return "Failed to save data. Data safely rolled back"; 
      } 
      catch(Exception ee) 
      { 
       ee.printStackTrace(); 
       return "Failed to save data. Data roll back failed"; 
      } 
     } 
    } 

你剛纔在上面的代碼中看到的是你如何將數據插入到同一個數據庫中3頁不同的表。然而,所有這3個表格的「表單字段」都包含在一個表格中,因此所有這些表格都應該立即更新,如果發生什麼情況,那麼只需插入所有3個表格中的數據就應該回滾。舉個例子,下面是數據庫代碼應該如何被調用。

MainUI.java

dbConnector.insertClient(name, address, phone, email, country, null, null); 

dbConnector.insertPortfolio(clientPortfolioId, name, amount, dicn, name, country, phone, visaEntryDate); 

dbConnector.insertClientFees(clientPortfolioId, initialFees, initialVisionFees, initialintraFees, ongoingFees, ongoingStepnaFees, ongoingIntraFees, ongoingFabulaFees, ongoingserFees, otherFees, VAT) 

所以我的問題是,如果出事了,我怎麼能回滾剛插入到所有3個表一次數據?

+0

您應該使用'TRANSACTION':http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html – 2014-08-27 08:14:24

+0

只需回滾事務 – Antoniossss 2014-08-27 08:17:01

+0

您應該使用相同的'Connection'實例來執行所有三個語句。然後調用'commit()'或'rollback()'一次。 每次調用'commit()'時,都不能回滾已提交的內容。 – Benjamin 2014-08-27 08:17:22

回答

5

您應該簡單地推高從方法try...catch阻止他們之外:

try { 
    con.setAutoCommit(false); 

    dbConnector.insertClient(... 
    dbConnector.insertPortfolio(... 
    dbConnector.insertClientFees(... 

    con.commit(); 
} catch(SQLException e) { 
    try { 
      con.rollback(); 
      e.printStackTrace(); 
      return "Failed to save data. Data safely rolled back"; 
    } 
    ... 
} 
+0

感謝您的回覆。但是如果變量'i'小於或等於0呢? – 2014-08-27 09:04:41

+0

@Hope當然,你也可以在這種情況下做回滾 – Andremoniy 2014-08-27 09:06:00

+0

嗯..不管怎麼說,它可以低於0不惜一切代價?如果是,那麼當然我必須實施回滾,如果這不是一個負責任的問題,那麼我沒有什麼可擔心的。 – 2014-08-27 09:07:55

2

您目前有3筆交易,每種方法都有一筆交易。您需要進行單筆交易(一個setAutoCommit(false)和一個commit()rollback())。

所以你需要相應地重構你的代碼。

1

你con.setAutoCommit(假);是好的,但你可能不會做con.commit();這每3個功能之前,經歷了...

try { 
    dbConnector.disableAutoCommit(); 
    dbConnector.insertClient(name, address, phone, email, country, null, null); 

    dbConnector.insertPortfolio(clientPortfolioId, name, amountInvested, dicn, name, country, phone, visaEntryDate); 

    dbConnector.insertClientFees(clientPortfolioId, initialEdenhurstFees, initialVisionFees, initialIntroducerFees, ongoingEdenhurstFees, ongoingVisionFees, ongoingIntroducerFees, ongoingCastleFees, ongoingEdenCastleFees, otherFees, VAT) 

    dbConnector.commit(); 
} catch(Esxception e) { 
    dbConnector.rollback(); 
} 

更喜歡這一點,YOUT插入函數不應該做的setAutoCommit(假)和commit(),回滾()的東西,也沒有捕捉到的異常自理

相關問題