JDBC 트랜잭션 처리
AutoCommitTest.java
01 import java.sql.*; 02 03 public class AutoCommitTest { 05 public static void main(String args[]){ 06 Connection con = null; 07 PreparedStatement ps = null; 08 int sequence = 0; 09 String subject = null; 10 String contents = null; 11 12 try { 13 if(args[0] != null 14 && args[1] != null 15 && args[2] != null){ 16 sequence = Integer.parseInt(args[0]); 17 subject = args[1]; 18 contents = args[2]; 19 } 20 }catch(Exception e){ 21 System.out.println 22 ("데이터베이스 내의 테이블에 존재하는 " 23 + "세개의 컬럼에 삽입할 데이터를 입력하세요."); 24 return; 25 } 26 27 try{ 28 String query1 = 29 " INSERT INTO TRANSACTION1 " + 30 " (sequence, subject, contents) "+ 31 " VALUES (?,?,?) "; 32 String query2 = 33 " INSERT INTO TRANSACTION2 " + 34 " (sequence, objects, contents) "+ 35 " VALUES (?,?,?) "; 36 37 Class.forName 38 ("oracle.jdbc.driver.OracleDriver"); 39 con=DriverManager.getConnection 40 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9" 41 ,"jDBC00","jDBC00"); 42 if(con.getAutoCommit()){ 43 System.out.println 44 ("현재의 Connection 은 " 45 + "자동 COMMIT 모드입니다."); 46 }else { 47 System.out.println 48 ("현재의 Connection 은 " 49 + "수동 COMMIT 모드입니다." 50 + "SQL 문장을 전송한 후에 " 51 + "commit() 이나 rollback() " 52 + "메서드를 수행하세요."); 53 } 54 55 ps = con.prepareStatement(query1); 56 ps.setInt(1,sequence); 57 ps.setString(2,subject); 58 ps.setString(3,contents); 59 ps.executeUpdate(); 60 ps = con.prepareStatement(query2); 61 ps.setInt(1,sequence); 62 ps.setString(2,subject); 63 ps.setString(3,contents); 64 ps.executeUpdate(); 65 System.out.println 66 ("두개의 테이블에 데이터 삽입이" 67 + "완료되었습니다." 68 + "SQL*PLUS 툴을 이용하여" 69 + "삽입된 결과를 확인해보세요."); 70 71 ps.close(); 72 con.close(); 73 }catch(Exception e){ 74 System.out.println 75 ("Exception이 발생했습니다." 76 + " 자세한 내용은 다음과 같습니다."); 77 System.out.println(e.toString()); 78 }finally { 79 try{ 80 if(ps != null) ps.close(); 81 if(con != null) con.close(); 82 }catch(Exception e){} 83 } 84 } 85 } |
위 예제에서는 하나의 테이블에 데이터가 삽입되지 못하더라도 이전에 수행한 테이블의 삽입 문장은 정상적으로 수행되어 결과적으로 하나의 테이블에만 데이터가 삽입되는 결과를 초래함.
왜냐하면 두개의 INSERT 문장이 실행되자 마자 서로 다른 트랜잭션으로 자동 COMMIT 되었기 때문
다음 예제는 두 개의 INSERT 문을 하나의 트랜잭션으로 처리
ExplicitCommitTest.java
01 import java.sql.*; 02 03 public class ExplicitCommitTest { 04 05 public static void main(String args[]){ 06 Connection con = null; 07 PreparedStatement ps = null; 08 int sequence = 0; 09 String subject = null; 10 String contents = null; 11 12 try { 13 if(args[0] != null 14 && args[1] != null 15 && args[2] != null){ 16 sequence = Integer.parseInt(args[0]); 17 subject = args[1]; 18 contents = args[2]; 19 } 20 }catch(Exception e){ 21 System.out.println 22 ("데이터베이스 내의 테이블에 존재하는 " 23 + "세개의 컬럼에 삽입할 데이터를 입력하세요."); 24 return; 25 } 26 27 try{ 28 String query1 = 29 " INSERT INTO TRANSACTION1 " + 30 " (sequence, subject, contents) "+ 31 " VALUES (?,?,?) "; 32 String query2 = 33 " INSERT INTO TRANSACTION2 " + 34 " (sequence, objects, contents) "+ 35 " VALUES (?,?,?) "; 36 37 Class.forName 38 ("oracle.jdbc.driver.OracleDriver"); 39 con=DriverManager.getConnection 40 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9" 41 ,"jDBC00","jDBC00"); 42 43 con.setAutoCommit(false); 44 if(con.getAutoCommit()){ 45 System.out.println 46 ("현재의 Connection 은 " 47 + "자동 COMMIT 모드입니다."); 48 }else { 49 System.out.println 50 ("현재의 Connection 은 " 51 + "수동 COMMIT 모드입니다." 52 + "SQL 문장을 전송한 후에 " 53 + "commit() 이나 rollback() " 54 + "메서드를 수행하세요."); 55 } 56 57 ps = con.prepareStatement(query1); 58 ps.setInt(1,sequence); 59 ps.setString(2,subject); 60 ps.setString(3,contents); 61 ps.executeUpdate(); 62 ps = con.prepareStatement(query2); 63 ps.setInt(1,sequence); 64 ps.setString(2,subject); 65 ps.setString(3,contents); 66 ps.executeUpdate(); 67 68 con.commit(); 69 System.out.println 70 ("두개의 테이블에 데이터 삽입이" 71 + "완료되었습니다." 72 + "SQL*PLUS 툴을 이용하여" 73 + "삽입된 결과를 확인해보세요."); 74 75 ps.close(); 76 con.close(); 77 }catch(Exception e){ 78 try{ 79 con.rollback(); 80 }catch(SQLException se){} 81 System.out.println 82 ("Exception이 발생했습니다.\n" 83 + "실행된 두개의 INSERT 문장은 " 84 + "ROLLBACK 처리되었습니다.\n" 85 + " 자세한 내용은 다음과 같습니다."); 86 System.out.println(e.toString()); 87 88 }finally { 89 try{ 90 if(ps != null) ps.close(); 91 if(con != null) con.close(); 92 }catch(Exception e){} 93 } 94 } 95 } |