Savepoint в JDBC транзакциях
Last updated: 9 мая 2025 г.Класс SavePoint
необходим для того, чтобы rollback был применен с определенной строки кода по определенную строку кода.
Пример программы:
1import java.sql.*;
2
3public class TransSaveP {
4 public static void main(String[] args)
5 throws ClassNotFoundException, SQLException {
6 Class.forName("com.mysql.cj.jdbc.Driver");
7 Connection connection =
8 DriverManager.getConnection(
9 "jdbc:mysql://localhost/storage",
10 "root", "07031998MSD");
11 Statement statement = connection.createStatement();
12
13 connection.setAutoCommit(false);
14
15 statement.executeUpdate("INSERT INTO books "
16 +"(name,author) VALUES (‘Book1’, ‘Author1’);");
17 statement.executeUpdate("INSERT INTO books "
18 +"(name,author) VALUES (‘Book2’, ‘Author2’);");
19 Savepoint savep = connection.setSavepoint();
20 try {
21 statement.executeUpdate("INSERT INTO books "
22 +"(name,author) VALUES (‘Book3’, ‘Author3’);");
23 statement.executeUpdate("INSERT INTO books "
24 +"(name,author) VALUES (‘Book4’, ‘Author4’);");
25 //на запросе ниже случится ошибка и переход в catch
26 statement.executeUpdate("INSERT INTO books (name,"
27 +"author) VALUES (‘Book5’, ‘Author5’, ‘str’);");
28 connection.commit();
29 }
30 catch (SQLException e) {
31 //Отменяются только
32 //запросы выполненные после создания savep,
33 //запросы до него не будут отменены
34
35 connection.rollback(savep);
36
37 //То есть в данном примере будут отменены
38 //только третий и четвертый запрос.
39 //То есть те, которые до ошибки
40 //и которые после savep
41
42 //Чтобы выполнились команды
43 //до создания savep вызываем commit
44 connection.commit();
45 }
46 statement.close();
47 connection.close();
48 }
49}
Скомпилируем, запустим программу и проверим таблицу books через MySQL консоль:

Видим, что случились только первый и второй запросы. То есть те, которые до savep. Всё после savep роллбекнулись.
Следующие уроки
Изоляция транзакций. Грязное чтение
15
мин.
Изоляция транзакций. Неповторяющееся чтение
15
мин.
Изоляция транзакций. Фантомное чтение
14
мин.