diff --git a/backend-spring/src/main/java/com/erp/batch/BatchExecutor.java b/backend-spring/src/main/java/com/erp/batch/BatchExecutor.java index a1d814f2..30438e01 100644 --- a/backend-spring/src/main/java/com/erp/batch/BatchExecutor.java +++ b/backend-spring/src/main/java/com/erp/batch/BatchExecutor.java @@ -6,7 +6,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.session.SqlSession; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.sql.Connection; import java.sql.PreparedStatement; @@ -222,7 +221,8 @@ public class BatchExecutor { // ── TO 저장 ──────────────────────────────────────────────────────────── - @Transactional + // 트랜잭션은 의도적으로 걸지 않음 — batch 의 정상 동작은 row 단위 독립 commit. + // 일부 row 가 실패해도 다른 row 는 살아야 successCount/failedCount 집계가 의미 있음. public WriteResult writeTo( Map firstMapping, List> rows, diff --git a/backend-spring/src/main/java/com/erp/service/BatchManagementService.java b/backend-spring/src/main/java/com/erp/service/BatchManagementService.java index c39e2676..c69f202f 100644 --- a/backend-spring/src/main/java/com/erp/service/BatchManagementService.java +++ b/backend-spring/src/main/java/com/erp/service/BatchManagementService.java @@ -161,7 +161,9 @@ public class BatchManagementService extends BaseService { Map updateLog = new LinkedHashMap<>(); updateLog.put("id", logId); updateLog.put("execution_status", status); - updateLog.put("end_time", new java.sql.Timestamp(System.currentTimeMillis()).toString()); + // PostgreSQL JDBC 드라이버가 Timestamp → timestamp 자동 변환. + // mapper 의 #{end_time}::timestamp 캐스트는 noop 으로 안전. + updateLog.put("end_time", new java.sql.Timestamp(System.currentTimeMillis())); updateLog.put("duration_ms", duration); updateLog.put("total_records", execResult != null ? execResult.totalRecords : 0); updateLog.put("success_records", execResult != null ? execResult.successRecords : 0);