Как выполнить RollBack после ошибки?
Я создаю приложение с 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();
}
}
1 ответ
Это та же проблема, что и следующая:
COMMIT ИЛИ conn.setAutoCommit(правда)
Короче говоря, вы не используете setAutoCommit правильным способом, поэтому такое поведение кода является правильным, вы должны либо явно вызвать commit
или оставьте Auto Commit для продолжения автоматической фиксации транзакций.