Транзакции позволяют контролировать как и когда изменения попадут в базу данных:
1. начало транзакции 2. операция 1 3. операция 2 4. операция 3 5. фиксация транзакции
Только после того, как произойдет фиксация транзакции изменения, сделанные операциями 2-4 попадут в базу. Если в какой-то из операций возникнет исключительная ситуация, то ни одно из изменений в базу не попадет.
Для того, чтобы выполнить запрос в рамках транзакции необходимо:
- Начать транзакцию с помощью
connection.setAutoCommit(false)
- Выполнить необходимые запрос
- Зафиксировать транзакцию с помощью
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(); } }