JDBC Транзакции

Транзакции позволяют контролировать как и когда изменения попадут в базу данных:

1. начало транзакции

2. операция 1
3. операция 2
4. операция 3

5. фиксация транзакции

Только после того, как произойдет фиксация транзакции изменения, сделанные операциями 2-4 попадут в базу. Если в какой-то из операций возникнет исключительная ситуация, то ни одно из изменений в базу не попадет.

Для того, чтобы выполнить запрос в рамках транзакции необходимо:

  1. Начать транзакцию с помощью connection.setAutoCommit(false)
  2. Выполнить необходимые запрос
  3. Зафиксировать транзакцию с помощью connection.commit()

Полный пример:

package ru.mydesignstudio.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * Created by abarmin on 09.03.16.
 */
public class Transaction {
    private static final String DRIVER_NAME = "org.h2.Driver";
    private static final String CONNECTION_STRING = "jdbc:h2:mem:~/test";

    private Connection getConnection() throws ClassNotFoundException, SQLException {
        Class.forName(DRIVER_NAME);
        Connection connection = DriverManager.getConnection(CONNECTION_STRING);
        return connection;
    }

    private void run() throws SQLException {
        Connection connection = null;
        try {
            final String createTable = "CREATE TABLE USERS_TABLE (" +
                    "ID INT NOT NULL, " +
                    "USER_NAME VARCHAR(255) NOT NULL, " +
                    "PRIMARY KEY (ID)" +
                    ")";

            final String insertRecord = "INSERT INTO USERS_TABLE " +
                    "(ID, USER_NAME) values " +
                    "(?, ?)";

            //
            connection = getConnection();
            connection.setAutoCommit(false);
            //
            PreparedStatement statement = connection.prepareStatement(createTable);
            statement.executeUpdate();
            //
            statement = connection.prepareStatement(insertRecord);
            statement.setInt(1, 1);
            statement.setString(2, "First user");
            statement.executeUpdate();
            //
            connection.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.close();
            }
        }
    }

    public static void main(String[] args) throws SQLException {
        Transaction example = new Transaction();
        example.run();
    }
}