728x90
반응형
트랜잭션 처리가 되지 않았을 때, 발생되는 문제를 확인하는 예제
SQL
CARD TABLE 생성
CREATE TABLE card(
id VARCHAR2(100) PRIMARY KEY,
name VARCHAR2(100) NOT NULL
);
POINT TABLE 생성
CREATE TABLE point(
id VARCHAR2(100) PRIMARY KEY,
point_type VARCHAR2(100) NOT NULL,
point NUMBER NOT NULL
);
JAVA JDBC
TestDAO class (main class)
카드 테이블에 카드 정보가 insert되고, 포인트 테이블에 포인트 정보가 insert될 때,
문제가 발생되었을 경우 포인트 정보는 등록되지 않고 , 카드 정보만 존재하는 경우를 만들어 본다.
--> 논리적 오류
/TestTransaction1.java
package test;
import model.CardDAO;
/**
* 트랜잭션 처리가 되지 않았을 때, 발생되는 문제를 확인하는 예제
* 카드 테이블에 카드 정보가 insert되고,
* 포인트 테이블에 포인트 정보가 insert될 때,
* 문제가 발생되었을 경우 포인트 정보는 등록되지 않고
* 카드 정보만 존재하는 경우를 만들어 본다.
* --> 논리적 오류
* @author yewoo
*
*/
public class TestTransaction1 {
public static void main(String[] args) {
try {
CardDAO dao = new CardDAO();
// 카드 생성과 포인트 부여하는 기능
// registerCardAndPoint(id, name, point_type, point)
dao.registerCardAndPoint("java", "아이유", "cgv", 1000);
// 오류 ! -> 카드는 발급 OK, 포인트는 발급 X !
dao.registerCardAndPoint("java2", "복숭아", "롯데", 1000);
System.out.println("카드와 포인트 INSERT 완료! \n");
} catch (Exception e) {
e.printStackTrace();
}
}
}
> 오류가 없을 때 결과
[ Card TABLE ]
[ Point TABLE ]
> 논리적 오류가 있을 때 결과 (CardDAO class에서 insertPointSql 쿼리문에 오류 발생시킴)
[ Card TABLE ] **java2 Card는 생성이 되었으나**
[ Point TABLE ] **java2에 Point가 들어오지 않았다 ! **
DAO ( Data Access Object ) class
: 데이베이스 연동 로직을 정의한 객체
하나의 Connection 내에서 여러 개의 기능을 넣을 수 있다 !
CardDAO
카드와 포인트 정보를 함께 등록하는 메서드를 구현 : registerCardAndPoint
--> transaction 처리의 필요성을 확인하는 예제
** Connect (pstmt 1 - 카드 등록, pstmt 2 - 포인트 등록)
두번째 test 실행 시, pstmt2에 오류가 생기도록 insertPointSql문을 이상하게 쓴다.
/CardDAO.java
package model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import common.DbInfo;
/**
* 카드와 포인트 정보를 함꼐 등록하는 메서드를 구현
* -> transaction 처리의 필요성을 확인하는 예제
* @author yewoo
*
*/
public class CardDAO {
//생성자
public CardDAO() throws ClassNotFoundException {
Class.forName(DbInfo.DRIVER_NAME);
}
//closeAll
public void closeAll(PreparedStatement pstmt, Connection con) throws SQLException {
if (pstmt != null)
pstmt.close();
if (con != null)
con.close();
}
//registerCardAndPoint method
public void registerCardAndPoint(String id, String name, String point_type, int point) throws SQLException {
Connection con = null;
PreparedStatement pstmt = null;
try {
con = DriverManager.getConnection(DbInfo.URL, DbInfo.USER, DbInfo.PASS);
// 1. card table에 insert
String insertCardSql = "INSERT INTO card(id, name) "+
"VALUES(?, ?)";
pstmt = con.prepareStatement(insertCardSql);
pstmt.setString(1, id);
pstmt.setString(2, name);
int resultCard = pstmt.executeUpdate();
System.out.println("CART INSERT SUCCESS --> " + resultCard);
pstmt.close();
// 2. point table에 insert
String insertPointSql = "INSERT INTO point(id, point_type, point) "+
"VALUES(?, ?, ?)";
pstmt = con.prepareStatement(insertPointSql);
pstmt.setString(1, id);
pstmt.setString(2, point_type);
pstmt.setInt(3, point);
int resultPoint = pstmt.executeUpdate();
System.out.println("POINT INSERT SUCCESS --> " + resultPoint);
} finally {
closeAll(pstmt, con);
}
}
}
728x90
반응형