JDBC 연결이 자동 커밋 모드에있는 경우 기본적으로 모든 SQL 문이 데이터베이스가 완료되면 데이터베이스에 커밋됩니다.
이것은 간단한 응용 프로그램을위한 것일 수 있지만 세 가지 이유로 자동 커밋을 끄고 자신의 거래를 관리하고 싶을 수도 있습니다.
트랜잭션을 제어하고 변경 사항이 데이터베이스에 적용될 때. 단일 SQL 문 또는 일련의 SQL 문을 논리 단위로 사용하고 문장이 실패하면 전체 트랜잭션이 실패합니다.
기본적으로 자동 커밋 모드 수동 트랜잭션 지원을 사용하는 JDBC 드라이버 대신 연결 오브젝트의 setautocommit () 메소드를 사용하십시오. 부울 값이 setautocommit ()로 전달되면 자동 커밋을 끄십시오. 부울 값을 다시 열기 위해 진실로 전달할 수 있습니다.
예를 들어, Conn Connection이라는 객체가 있으면 다음 코드가 자동 커밋을 끕니다.
conn.setAutocommit (false);
제출 및 롤백
변경 사항이 완료되면 변경 사항을 커밋 한 다음 다음과 같이 커밋 (연결 개체) 메소드를 호출하려고합니다.
conn.commit ();
그렇지 않으면 다음 코드를 사용하여 Connection Conn이라는 데이터베이스를 사용하는 롤백 업데이트가 있습니다.
conn.rollback ();
다음 예제는 커밋 및 롤백 개체를 사용하는 방법을 보여줍니다.
try {// 유효한 연결 객체를 가정합니다 Conn.setAutocommit (false); 문자 stmt = conn.createstatement (); 문자열 sql = "직원에 삽입" + "값 (106, 20, 'rita', 'tez')"; stmt.executeupdate (SQL); // String sql = "삽입 된 직원" + "값 (107, 22, 'sita', 'singh')을 깨뜨리는 오르플 링 된 SQL 문을 제출합니다. stmt.executeupdate (SQL); // 오류가없는 경우. conn.commit ();} catch (sqlexception se) {// 오류가있는 경우. conn.rollback ();}이 경우 위의 삽입 문은 성공하지 못하고 모든 것이 롤백됩니다.
거래 커밋 및 롤백 예제
다음은 트랜잭션 커밋 및 롤백 설명을 사용하는 예입니다.
이 샘플 코드는 이전 장의 환경 및 데이터베이스 설치를 기반으로 학습되었습니다.
다음과 같이 과거의 다음 예제에서 jdbcexample.java를 복사하십시오.
// 1 단계. 가져 오기 필수 패키지 java.sql.*; public class jdbcexample {// jdbc 드라이버 이름 및 데이터베이스 URL 정적 최종 문자열 jdbc_driver = "com.mysql.jdbc.driver"; 정적 최종 문자열 db_url = "jdbc : mysql : // localhost/emp"; // 데이터베이스 자격 증명 정적 최종 문자열 user = "사용자 이름"; 정적 최종 문자열 pass = "비밀번호"; public static void main (String [] args) {Connection Conn = null; 문자 stmt = null; {// 2 단계 : jdbc driver class.forname을 등록합니다 ( "com.mysql.jdbc.driver"); // 3 단계 : Connection System.out.println을 엽니 다 ( "데이터베이스 연결 ..."); conn = drivermanager.getConnection (db_url, user, pass); // 4 단계 : 자동 커밋을 False로 설정합니다. conn.setAutocommit (false); // 5 단계 : query를 실행하여 RS 예제에 필요한 인수를 사용하여 문을 작성합니다. System.out.println ( "제작 명령문 ..."); stmt = conn.createstatement (resultset.type_scroll_insensive, resultset.concur_updatable); // 6 단계 : 직원에 행을 삽입 테이블 System.out.println ( "한 행 삽입 ...."); 문자열 sql = "직원에 삽입" + "값 (106, 20, 'rita', 'tez')"; stmt.executeupdate (SQL); // 7 단계 : 직원에 한 줄 하나를 더 삽입하십시오. 테이블 SQL = "직원" + "값 삽입 (107, 22, 'sita', 'singh')"; stmt.executeupdate (SQL); // 8 단계 : 여기에 데이터를 커밋합니다. System.out.println ( "여기에 데이터를 여기서 ...."); conn.commit (); // 9 단계 : 이제 사용 가능한 모든 레코드를 나열하십시오. String SQL = "ID, 첫 번째, 마지막, 직원의 연령 선택"; resultSet rs = stmt.executeQuery (SQL); System.out.println ( "참조 목록 세트 ..."); 프린트 (Rs); // 10 단계 : 정리 환경 rs.close (); stmt.close (); conn.close (); } catch (sqlexception se) {// jdbc se.printstacktrace ()의 오류 핸들. // 오류가 있으면 변경 사항이 롤백됩니다. System.out.println ( "여기에서 데이터 롤백 데이터 ..."); 시도 {if conn! = null) conn.rollback (); } catch (sqlexception se2) {se2.printstacktrace (); } // end try} catch (예외 e) {// class.forname e.printstacktrace ()의 오류 핸들. } 마침내 {// 마지막으로 자원을 닫는 데 사용되는 블록 {if (stmt! = null) stmt.close (); } catch (sqlexception se2) {} // 우리가 할 수있는 것은 없습니다 {if (conn! = null) conn.close (); } catch (sqlexception se) {se.printstacktrace (); } // 종료 마침내 try} // End try system.out.println ( "goodbye!");} // 종료 메인 퍼블릭 정적 void printrs (resultet rs) sqlexception {// 첫 번째 행으로 시작해야합니다. rs.beforefirst (); while (rs.next ()) {// 열별로 검색 int id = rs.getint ( "id"); int age = rs.getint ( "Age"); 문자열 first = rs.getString ( "첫 번째"); 문자열 last = rs.getString ( "last"); // 디스플레이 값 값 system.out.print ( "id :" + id); System.out.print ( ", 나이 :" + age); System.out.print ( ", 첫 번째 :" + first); System.out.println ( ", 마지막 :" + last); } system.out.println (); } // end printrs ()} // end jdbcexample이제 위의 예를 다음과 같이 컴파일하겠습니다.
C :> javac jdbcexample.java
jdbcexample을 실행할 때 다음과 같은 결과가 발생합니다.
C :> Java jdbcexample
데이터베이스에 연결 ... 명령문을 작성 ... 한 행을 삽입 .... 여기에 데이터 커밋 .... 여기에 데이터 커밋 .... id : 100, 나이 : 18, 첫 번째 : Zara, Zara, Last : Aliid : 101, Age : 25, First : Mahnaz, Last : 102, Age : 30, 첫 번째 : Zaid, Khanid : 103, Age : 28, First : Mittalid : Mittalid : Mittalid : Mittalid : Mittalid : Mittalid : Mittalid : Mittalid. Tezid : 107, 나이 : 22, 첫 번째 : Sita, Last : Singhgoodbye!