트랜잭션 ?
- 하나의 논리적인 작업 단위
- 자바에서 INSERT, UPDATE, DELETE 등의 작업을 실행하면 기본적으로 자동 COMMIT
실습용 테이블
더보기
CREATE TABLE test1 (
id VARCHAR2(30) PRIMARY KEY,
name VARCHAR2(30) NOT NULL
);
CREATE TABLE test2 (
id VARCHAR2(30) PRIMARY KEY,
birth VARCHAR2(30) NOT NULL,
FOREIGN KEY(id) REFERENCES test1(id)
);
CREATE TABLE test3 (
id VARCHAR2(30) PRIMARY KEY,
tel VARCHAR2(30) NOT NULL,
FOREIGN KEY(id) REFERENCES test1(id)
);
SELECT * FROM test1;
SELECT * FROM test2;
SELECT * FROM test3;
package transEx;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import db_util.DBConn;
public class Ex_Transaction {
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Connection conn = DBConn.getConnection();
PreparedStatement pstmt = null;
String sql;
String id, name, birth, tel;
try {
System.out.print("아이디 ? ");
id = br.readLine();
System.out.print("이름 ? ");
name = br.readLine();
System.out.print("생년월일 ? ");
birth = br.readLine();
// 전화번호를 입력하지 않고 그냥 엔터를 누를경우와 전화번호를 입력했을 때와 비교
System.out.print("전화번호 ? ");
tel = br.readLine();
// 트랜잭션이 필요한 부분은 반드시 하나의 try 블록에서 모두 코드를 작성해야 한다.
// 자동으로 COMMIT 되지 않도록 설정
conn.setAutoCommit(false);
sql = "INSERT INTO test1(id, name) VALUES (?, ?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, name);
pstmt.executeUpdate();
pstmt.close();
sql = "INSERT INTO test2(id, birth) VALUES (?, ?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, birth);
pstmt.executeUpdate();
pstmt.close();
sql = "INSERT INTO test3(id, tel) VALUES (?, ?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, tel);
pstmt.executeUpdate();
// 커밋
conn.commit();
System.out.println("데이터 추가 성공...");
} catch (SQLException e) {
try {
// 세 개의 테이블 중 하나의 테이블이라도 추가하는 도중에 에러가 발생하면 모두 롤백
conn.rollback();
} catch (Exception e2) {
}
System.out.println(e.toString());
System.out.println("데이터 추가 실패...");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (pstmt != null) {
try {
pstmt.close();
} catch (Exception e2) {
}
}
try {
conn.setAutoCommit(true);
} catch (Exception e2) {
}
DBConn.close(); // 프로그램 종료 시
}
}
}
conn.setAutoCommit(false)를 통해 트랜잭션이 다 이뤄지고 나서 3개의 테이블에 모두 COMMIT되지 않는 경우에는 데이터가 들어가지 않도록 한다. 또 트랜잭션이 필요한 부분은 반드시 하나의 try 블록에서 모두 코드를 작성해야한다. 예외가 발생했을때는 ROLLBACK을 통해 데이터가 들어가지 않도록 해야한다.
'쌍용강북교육센터 > 9월' 카테고리의 다른 글
0902_데이터 모델링 및 설계 (0) | 2021.09.03 |
---|---|
0902_Java : JDBC : 자바로 SQLPlus와 비슷한 프로그램 짜기 (0) | 2021.09.02 |
0901_Java : JDBC : Metadata 메타데이터 (0) | 2021.09.02 |
0901_Java : JDBC : Scroll (0) | 2021.09.02 |
0901_Java : JDBC : 쿼리실행 (0) | 2021.09.02 |