jdbc - savepoint

jinkyung·2021년 1월 15일
0

DBMS

목록 보기
21/21

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();
			}
			
		}
	}
}

0개의 댓글