交易與批次處理

在 Java 中查詢 PostgreSQL 資料庫

Miller Trujillo

Staff Software Engineer

問題在哪裡?

  • 交易:資料庫操作的安全網
  • 全部成功,或全部失敗

$$

$$

銀行轉帳交易範例

在 Java 中查詢 PostgreSQL 資料庫

ACID 特性

  • 原子性(A):要嘛全部完成,要嘛都不生效
  • 一致性(C):資料庫維持有效狀態
  • 隔離性(I):操作彼此不互相干擾
  • 耐久性(D):已完成的交易可永久保存

ACID 特性

  • 預設情況下,JDBC 使用自動提交模式 🔄
在 Java 中查詢 PostgreSQL 資料庫

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(); }
在 Java 中查詢 PostgreSQL 資料庫

銀行轉帳範例

// 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:指定要變更的欄位
在 Java 中查詢 PostgreSQL 資料庫

銀行轉帳範例

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(); } }
在 Java 中查詢 PostgreSQL 資料庫

批次處理

  • 將多個操作成組執行

$$

Screenshot 2025-12-03 at 10.40.25.png

在 Java 中查詢 PostgreSQL 資料庫

批次處理範例

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
在 Java 中查詢 PostgreSQL 資料庫

一起來練習吧!

在 Java 中查詢 PostgreSQL 資料庫

Preparing Video For Download...