如何回滚数据一次插入到3个表中?
请看看下面的代码如何回滚数据一次插入到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个表一次数据?
您应该简单地推高从方法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";
}
...
}
感谢您的回复。但是如果变量'i'小于或等于0呢? – 2014-08-27 09:04:41
@Hope当然,你也可以在这种情况下做回滚 – Andremoniy 2014-08-27 09:06:00
嗯..不管怎么说,它可以低于0不惜一切代价?如果是,那么当然我必须实施回滚,如果这不是一个负责任的问题,那么我没有什么可担心的。 – 2014-08-27 09:07:55
您目前有3笔交易,每种方法都有一笔交易。您需要进行单笔交易(一个setAutoCommit(false)
和一个commit()
或rollback()
)。
所以你需要相应地重构你的代码。
你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(),回滚()的东西,也没有捕捉到的异常自理
您应该使用'TRANSACTION':http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html – 2014-08-27 08:14:24
只需回滚事务 – Antoniossss 2014-08-27 08:17:01
您应该使用相同的'Connection'实例来执行所有三个语句。然后调用'commit()'或'rollback()'一次。 每次调用'commit()'时,都不能回滚已提交的内容。 – Benjamin 2014-08-27 08:17:22