Транзакции и пакетная обработка

Работа с базой данных PostgreSQL на Java

Miller Trujillo

Staff Software Engineer

В чём проблема?

  • Транзакция: защитный механизм для операций с базой данных
  • Все операции либо выполняются, либо откатываются вместе

$$

$$

Пример банковской транзакции

Работа с базой данных PostgreSQL на Java

Свойства ACID

  • Atomicity (атомарность): все операции выполняются или ни одна
  • Consistency (согласованность): база данных остаётся корректной
  • Isolation (изолированность): операции не мешают друг другу
  • Durability (устойчивость): завершённые транзакции сохраняются навсегда

Свойства ACID

  • По умолчанию JDBC работает в режиме автофиксации 🔄
Работа с базой данных PostgreSQL на Java

Управление транзакциями в JDBC

Connection conn = DriverManager.getConnection(DB_URL, USERNAME, PASSWORD)
conn.setAutoCommit(false);

try (...) { // Execute your SQL statements here
conn.commit();
} catch (SQLException e) { conn.rollback(); }
Работа с базой данных PostgreSQL на Java

Пример банковского перевода

// Reduce the sender's balance
String withdrawSQL = "UPDATE accounts SET balance = balance - ?
  WHERE account_id = ? AND balance >= ?";

// Increase the recipient's balance String depositSQL = "UPDATE accounts SET balance = balance + ? WHERE account_id = ?";

$$

  • UPDATE — изменяет существующие строки в таблице
  • SET — указывает, какие столбцы нужно обновить
Работа с базой данных PostgreSQL на Java

Пример банковского перевода

try (Connection conn = DriverManager.getConnection(DB_URL, USERNAME, PASSWORD)) {

conn.setAutoCommit(false);
try { try (PreparedStatement withdrawStmt = conn.prepareStatement(withdrawSQL); PreparedStatement depositStmt = conn.prepareStatement(depositSQL)) { // Set parameters and execute both statements... }
conn.commit();
} catch (SQLException e) { conn.rollback(); } }
Работа с базой данных PostgreSQL на Java

Пакетная обработка

  • Объединяет несколько операций в одну группу

$$

Screenshot 2025-12-03 at 10.40.25.png

Работа с базой данных PostgreSQL на Java

Пример пакетной обработки

PreparedStatement pstmt = conn.prepareStatement("INSERT INTO transfers
   (sender_id, recipient_id, amount) VALUES (?, ?, ?)")

for (Object[] transfer : transfers) { pstmt.setInt(1, (Integer) transfer[0]); pstmt.setInt(2, (Integer) transfer[1]); pstmt.setInt(3, (Integer) transfer[2]);
pstmt.addBatch(); // Queue for later }
int[] results = pstmt.executeBatch(); // Send all at once
Работа с базой данных PostgreSQL на Java

Давайте потренируемся!

Работа с базой данных PostgreSQL на Java

Preparing Video For Download...