Java 错误后如何执行回滚?
我正在用Java构建一个应用程序,将数据存储到Mysql数据库中 因此,我正在构建一段代码,如果数据正确地保存在数据库上,则首先保存数据,setAutocommit=false,setAutocommit=true 如果出现错误,执行数据回滚 所以代码是execute never error,但不起作用,因为我试图保存的数据有一个主键Integer autoincrement,如果下次保存时出现错误,系统将跳转该数字 例如,在我的数据库中,如果我试图保存另一条记录CodiceFattura=101,则字段CodiceFattura=100。现在如果我有CodiceFattura=100,我尝试保存,我有一个错误,我修复了错误,然后保存CodiceFattura=102,而不是101 代码如下:Java 错误后如何执行回滚?,java,mysql,rollback,autocommit,Java,Mysql,Rollback,Autocommit,我正在用Java构建一个应用程序,将数据存储到Mysql数据库中 因此,我正在构建一段代码,如果数据正确地保存在数据库上,则首先保存数据,setAutocommit=false,setAutocommit=true 如果出现错误,执行数据回滚 所以代码是execute never error,但不起作用,因为我试图保存的数据有一个主键Integer autoincrement,如果下次保存时出现错误,系统将跳转该数字 例如,在我的数据库中,如果我试图保存另一条记录CodiceFattura=10
public boolean salvaFattura(String tipoFattura){
fatturaIstanza= istanziaValori(null);
boolean tuttoOk=false;
try{
setCommitManager(false);
tuttoOk=modelManager.getFatturaManager().inserisciFatturaArticoliSenzaCodice(fatturaIstanza,tipoFattura);
if(!tuttoOk){
VisualMessageFattura.getErrore();
eseguiRollBack();
}
Integer.parseInt(null);
setCommitManager(true);
}
catch(Exception e){
VisualMessage.getShowMessaggioErroreFatturaSalvata("Fattura");
log.logStackTrace(e);
eseguiRollBanck();
return false;
}
return tuttoOk;
}
public void eseguiRollBanck(){
try{
modelManager.getFatturaManager().eseguiRollBack();
}catch(Exception e){
log.logStackTrace(e);
}
try{
db.eseguiRollBack();
}catch(Exception e){
log.logStackTrace(e);
}
}
public void setCommitManager(Boolean state){
modelManager.getFatturaManager().setAutoCommit(state);
}
public void eseguiRollBack(){
try {
db.rollback();
} catch (SQLException e) {
log.logStackTrace(e);
//VisualMessage.getErroreDB();
}
}
public void setAutoCommit(boolean autoCommit){
try {
db.setAutoCommit(autoCommit);
} catch (SQLException e) {
log.logStackTrace(e);
VisualMessage.getErroreDB();
}
}
这与以下问题相同:
简而言之,您使用setAutoCommit的方式不正确,因此此代码行为是正确的,您应该显式调用
commit
方法,或者让Auto commit继续自动提交事务。主键的自动递增是否有帮助?是的,字段CodiceFattura是PrimaryKey,autoincrement不显式传递主键的值。因此,如果您将自动提交设置为off,DB会注意。在写入数据库之前,请先验证数据。在将所有数据写入数据库后执行提交,以确保数据的一致性。回滚是针对数据库错误,而不是数据验证。@GilbertLeBlanc我设置了autoCommitFalse,如果一切正常,我设置了autocommit(true)。如果我在存储过程中出错,我想执行回滚,但这不起作用+嗯,谢谢你的回答。但在salvaFattura方法中,我在数据库中保存fattura,但在数据库中执行其他操作,如果所有操作都正确完成,我希望将autocommit设置为true。autocommit意味着每次执行SQL语句时,它都会将其作为自己的事务提交,因此,这不是您希望发生的事情,您所说的是执行所有SQL语句,然后根据这些语句的结果回滚事务或提交事务。在这种情况下,您需要将AutoCommit设置为false,然后显式调用commit()
或rollback()
,以实现保存或不保存。