В 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 | + | Предотвращено | Предотвращено | Предотвращено |