save point
: 그 상태를 저장
만약 100개 행 중에서 3개 행까지 실행하고 오류가 났다면, 실행되지 않았던 상태로 돌아가는 것이 아니라
3개 실행까지 저장되어 다음 시도에 4행부터 실행할 수 있다면 좋을 것이다.
package ex03.jdbcp.savept;
import java.sql.*;
import java.util.Scanner;
public class SavePointEx {
static {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
static int getChangeState() {
int num = 0;
System.out.println("1, 250000 Commit");
System.out.println("2, 최초상태");
System.out.println("3, 50000 상태 ");
Scanner sc = new Scanner(System.in);
num = sc.nextInt();
sc.close();
return num;
}
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String id = "bitTest";
String pass = "bitTest";
Connection con = null;
PreparedStatement pstmt = null;
Savepoint savePt0 = null; //상태 저장, 언제든지 해당 상태로 롤백.
Savepoint savePt1 = null;
try {
con = DriverManager.getConnection(url, id, pass);
//수동 커밋으로 변경
con.setAutoCommit(false);
// 최초 상태 저장
savePt0 = con.setSavepoint(); //money가 0일 때
// 1번째 업데이트 실행
String str0 = "UPDATE kb SET money=? WHERE sname='홍길동'";
pstmt = con.prepareStatement(str0);
pstmt.setString(1, "50000");
pstmt.executeUpdate();
// 1번째 실행 후 상태 저장
savePt1 = con.setSavepoint(); //money가 50000일 때
// 2번째 업데이트 실행
pstmt.setString(1, "250000"); // 25만인 상태
pstmt.executeUpdate();
// 메뉴 선택으로 결정
int sel = getChangeState();
switch(sel) {
case 1:
System.out.println("commit 완료! "); //밑에서 커밋하니까 아무것도 안하고 출력만.
break;
case 2:
con.rollback(savePt0);
System.out.println("savePt0 rollback!");
break;
case 3:
con.rollback(savePt1);
System.out.println("savePt1 rollback!");
break;
default:
System.out.println("잘못입력했습니다 ");
break;
}
con.commit();
con.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(pstmt != null) pstmt.close();
if(con != null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}