【发布时间】:2016-08-12 10:50:09
【问题描述】:
我正在使用 Java 构建一个将数据存储到 Mysql 数据库中的应用程序。
所以我正在构建首先保存数据的代码,setAutocommit=false,如果数据正确保存在数据库 setAutocommit=true 上。
如果有错误执行数据回滚。
所以代码执行永远不会出错但不起作用,因为我尝试保存的数据具有主键整数自动增量,如果下次保存时出现错误,系统会跳转数字。
例如在我的数据库中提交的 CodiceFattura = 100,如果我尝试保存另一条记录 CodiceFattura = 101。现在如果我有 CodiceFattura = 100,我尝试保存,我有一个错误,我修复了错误然后保存 CodiceFattura = 102 而不是 101。
这是代码:
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();
}
}
【问题讨论】:
-
主键的自动增量没有帮助吗?
-
是的 CodiceFattura 字段是 PrimaryKey 和 Autoincrement
-
不要显式传递主键的值。所以数据库会注意该字段
-
您将自动提交设置为关闭。在写入数据库之前验证数据。在将所有数据写入数据库后执行提交,以确保数据的一致性。回滚是针对数据库错误,而不是数据验证。
-
@GilbertLeBlanc 我设置了 autoCommitFalse,如果一切正常,我设置了 autocommit(true)。如果我在存储过程中出现错误,我想做回滚,但这不起作用+
标签: java mysql rollback autocommit