Бесплатный курс по Java: от основ до продвинутого уровня
Savepoint в JDBC транзакциях
Класс SavePoint необходим для того, чтобы rollback был применен с определенной строки кода по определенную строку кода.
Пример программы:
import java.sql.*;
public class TransSaveP {
public static void main(String[] args)
throws ClassNotFoundException, SQLException {
Class.forName(“com.mysql.cj.jdbc.Driver”);
Connection connection =
DriverManager.getConnection(
“jdbc:mysql://localhost/storage”,
“root”, “07031998MSD”);
Statement statement = connection.createStatement();
connection.setAutoCommit(false);
statement.executeUpdate(“INSERT INTO books ”
+”(name,author) VALUES (‘Book1’, ‘Author1’);”);
statement.executeUpdate(“INSERT INTO books ”
+”(name,author) VALUES (‘Book2’, ‘Author2’);”);
Savepoint savep = connection.setSavepoint();
try {
statement.executeUpdate(“INSERT INTO books ”
+”(name,author) VALUES (‘Book3’, ‘Author3’);”);
statement.executeUpdate(“INSERT INTO books ”
+”(name,author) VALUES (‘Book4’, ‘Author4’);”);
//на запросе ниже случится ошибка и переход в catch
statement.executeUpdate(“INSERT INTO books (name,”
+”author) VALUES (‘Book5’, ‘Author5’, ‘str’);”);
connection.commit();
}
catch (SQLException e) {
//Отменяются только
//запросы выполненные после создания savep,
//запросы до него не будут отменены
connection.rollback(savep);
//То есть в данном примере будут отменены
//только третий и четвертый запрос.
//То есть те, которые до ошибки
//и которые после savep
//Чтобы выполнились команды
//до создания savep вызываем commit
connection.commit();
}
statement.close();
connection.close();
}
}
Скомпилируем, запустим программу и проверим таблицу books через MySQL консоль:
Видим, что случились только первый и второй запросы. То есть те, которые до savep. Всё после savep роллбекнулись.
Узнайте, что такое грязное чтение в транзакциях SQL и JDBC. Разберитесь с уровнями изоляции TRANSACTION_READ_COMMITTED и TRANSACTION_READ_UNCOMMITTED на практических примерах.
Time to read: 15
Изоляция транзакций. Неповторяющееся чтение
Объяснение неповторяющегося чтения в JDBC. Используйте TRANSACTION_REPEATABLE_READ для согласованности данных между SELECT-запросами.