Управление транзакциями JDBC в Java

В Java есть множество модулей, предназначенных для взаимодействия с базами данных. Одним из них является блок JDBC, это аббревиатура от Java Database Connection.

Основное назначение JDBC — обеспечить подключение к базе данных через определенный драйвер со специальным набором SQL-запросов и команд. По умолчанию каждая операция с базой данных имеет уникальную транзакцию JDBC, в режиме автокомита. Это означает, что каждая SQL-операция будет вызываться с командой Commit.

JDBC Auto-Commit. Как отключить?

Как мы уже говорили, режим автокоммита JDBC установлен по умолчанию. Но есть возможность отключить этот режим, когда нам нужно выполнить несколько SQL-операторов в рамках одной операции. Для этого смотрите код ниже. Где переменная connection — это активное соединение с базой данных.

connection.setAutoCommit(false);

Пример транзакции JDBC

После отключения автокоммита необходимо вызвать метод Commit, также известный как подтвержденная Java SQL транзакция. В транзакции Java JDBC мы можем выполнить несколько связанных между собой SQL-запросов.

public void updateEmployeeSalaryAndExperince(HashMap<String, Integer> employees) throws SQLException {
    String updateSalaryString =
      "update EMPLOYEE set SALARY = ? where NAME = ?";
    String updateExperienceStatment =
      "update EMPLOYEE set EXP_YEARS = EXP_YEARS + ? where NAME = ?";
    try (PreparedStatement updateSalary = con.prepareStatement(updateSalaryString);
         PreparedStatement updateExperience = con.prepareStatement(updateExperienceStatment))
    
    {
      connection.setAutoCommit(false);
      for (Map.Entry<String, Integer> e : employees.entrySet()) {
        updateSalary.setInt(1, e.getValue().intValue());
        updateSalary.setString(2, e.getKey());
        updateSalary.executeUpdate();
        updateExperience.setInt(1, e.getValue().intValue());
        updateExperience.setString(2, e.getKey());
        updateExperience.executeUpdate();
        connection.commit();
      }
    } catch (SQLException e) {
      System.err.print(e.getMessage());
      if (con != null) {
        try {
          System.err.print("Transaction is being rolled back");
          connection.rollback();
        } catch (SQLException excep) {
          System.err.print(excep);
        }
      }
    }
  }

Транзакция базы данных Java завершается, когда мы вызываем метод Commit объекта соединения или отклоняем методом Rollback. JDBC начинает транзакцию сразу после установки значения auto-commit в false и подготовки SQL-запросов.

В этом конкретном примере мы пытаемся сгруппировать два SQL-запроса для обновления сотрудника в одной транзакции. Сначала мы предоставляем зарплату, а затем обновляем опыт работы сотрудника в годах. Оба запроса завершаются методом Commit. В случае непредвиденных исключений мы пытаемся откатить транзакцию.

Уровни изоляции транзакций в JDBC

Иногда транзакции помогают предотвратить целостность данных в таблицах. В некоторых случаях мы можем читать, а затем обновлять/вставлять новые данные в БД. Эти операции по чтению данных могут выполняться с некоторыми уровнями изоляции. Смотрите таблицу ниже. Основное отличие в том, что вы можете читать подтвержденные или не подтвержденные данные, это может быть TRANSACTION_READ_COMMITTED или TRANSACTION_READ_UNCOMMITTED.

Кроме того, могут быть повторяющееся чтения данных. Это может быть несколько селектов данных, где в середине операции может быть обновление данных. Каждый раз при новом селекте данные должны обновляться.

Фантомные операции — это также операции выбора, где некоторое количество выбранных строк может измениться из-за вставки/удаления данных.

УРОВЕНЬ ИЗОЛЯЦИИТРАНЗАКЦИИГРЯЗНОЕ ЧТЕНИЕНЕПОВТОРЯЮЩИЕСЯ ЧТЕНИЕФАНТОМНОЕ ЧТЕНИЕ
TRANSACTION_NONE
TRANSACTION_READ_COMMITTED+ПредотвращеноРазрешеноРазрешено
TRANSACTION_READ_UNCOMMITTED+РазрешеноРазрешеноРазрешено
TRANSACTION_REPEATABLE_READ+ПредотвращеноПредотвращеноРазрешено
TRANSACTION_SERIALIZABLE+ПредотвращеноПредотвращеноПредотвращено

Related posts

Leave a Comment