Giao dịch và xử lý theo lô

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Miller Trujillo

Staff Software Engineer

Vấn đề là gì?

  • Transaction: lưới an toàn cho các thao tác trên CSDL
  • Tất cả thao tác cùng thành công hoặc cùng thất bại

$$

$$

Ví dụ giao dịch chuyển khoản ngân hàng

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Các thuộc tính ACID

  • Atomicity: hoặc hoàn tất, hoặc không áp dụng gì cả
  • Consistency: CSDL luôn hợp lệ
  • Isolation: ngăn các thao tác ảnh hưởng lẫn nhau
  • Durability: giao dịch hoàn tất được lưu vĩnh viễn

Thuộc tính ACID

  • Mặc định, JDBC chạy ở chế độ auto-commit 🔄
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Điều khiển giao dịch trong 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(); }
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Ví dụ chuyển khoản ngân hàng

// 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 - sửa các hàng hiện có trong bảng
  • SET - chỉ định cột sẽ thay đổi
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Ví dụ chuyển khoản ngân hàng

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(); } }
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Xử lý theo lô

  • Gom nhiều thao tác lại với nhau

$$

Screenshot 2025-12-03 at 10.40.25.png

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Ví dụ xử lý theo lô

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
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Cùng luyện tập nào!

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Preparing Video For Download...