Топ-100Savepoint в JDBC транзакциях - CodOrbits
LogoCodOrbits

Раздел: JDBC

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

Все разделы
Иконка JDBC

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
мин.

Similar Articles Icon
Divider

Изоляция транзакций. Неповторяющееся чтение

15
мин.

Similar Articles Icon
Divider

Изоляция транзакций. Фантомное чтение

14
мин.

Similar Articles Icon