#java #sqlite #jdbc #sql-update
Вопрос:
Я использую эти два метода для обновления баланса банковского приложения, которое я пишу, но база данных отказывается обновляться, и я не уверен, почему.
Функция для определения того, сколько нужно добавить:
public void addIncome(String cardNum,Scanner scanner){
System.out.println("Enter income: ");
int income = scanner.nextInt();
scanner.nextLine();
dataBase.addBalance(income,cardNum);
}
Подготовленная инструкция и функция для запроса:
private final String ADD_BALANCE = ("UPDATE card SET balance=balance ? WHERE number=?");
public void addBalance(int amount, String number){
try (Connection con = this.dataSource.getConnection();
final var sql = con.prepareStatement(ADD_BALANCE)){
sql.setInt(1, amount);
sql.setString(2,number);
sql.executeUpdate();
}catch (SQLException throwables) {
throwables.printStackTrace();
}
}
Комментарии:
1. Если
getConnection
возвращает соединение, ориентированное на транзакции, то вам необходимо зафиксировать его после обновления. Но если включена автоматическая фиксация, то проблема в другом. Сделайте это: (а) проверьте баланс перед отъездомtry
, а затем проверьте баланс еще раз после возвращенияaddBalance
, тогда вы будете знать лучше.
Ответ №1:
Вы пропускаете вызов commit
, что означает, что транзакция неявно откатится, когда соединение будет закрыто (в конце try
).
try (Connection con = this.dataSource.getConnection();
final var sql = con.prepareStatement(ADD_BALANCE)) {
sql.setInt(1, amount);
sql.setString(2, number);
sql.executeUpdate();
con.commit(); // HERE
}
Комментарии:
1. По умолчанию источник данных должен возвращать соединение, находящееся в режиме автоматической фиксации.