База данных SQLite отказывается обновляться, и я не уверен, почему

#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. По умолчанию источник данных должен возвращать соединение, находящееся в режиме автоматической фиксации.