트랜잭션과 배치 처리

Java에서 PostgreSQL 데이터베이스 질의하기

Miller Trujillo

Staff Software Engineer

문제는 무엇일까요?

  • 트랜잭션: 데이터베이스 작업의 안전망
  • 모든 작업이 함께 성공하거나 함께 실패합니다

$$

$$

은행 이체 트랜잭션 예시

Java에서 PostgreSQL 데이터베이스 질의하기

ACID 속성

  • 원자성: 전부 완료되거나 전혀 적용되지 않음
  • 일관성: 데이터베이스의 유효성 보장
  • 격리성: 작업 간 간섭 방지
  • 지속성: 완료된 트랜잭션은 영구 보존

ACID 속성

  • 기본적으로 JDBC는 자동 커밋 모드로 동작합니다 🔄
Java에서 PostgreSQL 데이터베이스 질의하기

JDBC에서 트랜잭션 제어

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

try (...) { // 여기에서 SQL 문을 실행
conn.commit();
} catch (SQLException e) { conn.rollback(); }
Java에서 PostgreSQL 데이터베이스 질의하기

은행 이체 예시

// 송금인 잔액 차감
String withdrawSQL = "UPDATE accounts SET balance = balance - ?
  WHERE account_id = ? AND 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)) { // 매개변수를 설정하고 두 문을 실행... }
conn.commit();
} catch (SQLException e) { conn.rollback(); } }
Java에서 PostgreSQL 데이터베이스 질의하기

배치 처리

  • 여러 작업을 한 번에 묶습니다

$$

배치 처리 스크린샷

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(); // 나중에 일괄 실행 큐에 추가 }
int[] results = pstmt.executeBatch(); // 한 번에 전송
Java에서 PostgreSQL 데이터베이스 질의하기

연습해 봅시다!

Java에서 PostgreSQL 데이터베이스 질의하기

Preparing Video For Download...