재고 업데이트를 빵코드를 받아서 하다보니까 빵코드에 해당하는 재고는 입고번호에 따라 계속 넣어지는데, (즉 빵코드에 해당하는 자료가 입고받을 때마다 넣어지므로 여러개) 재고를 2번을 입고 받았었기 때문에 해당 빵코드의 qty에서 -5가 다 들어가기 때문에 2번의 입고 정보에 다 -5가 되어서 -10이 되었던 것이다.
납품업체 리스트 확인.
납품업체 하나에 (부모테이블) 입고(자식테이블) 이 여러개가 존재할 수 있다. 참조키로 납품업체 코드를 해놨다. 그래서 납품업체 삭제는 거의 사용하지 않을 듯. 입고를 한번이라도 했으면 삭제해도 자식 레코드는 재고를 위해서 사용해야되서.
입고날짜를 넣어줄때는 매개변수가 없는 메소드를 통해 현재 날짜를 넣어주고,
데이터베이스에서 가져올 때는 매개변수가 있는 메소드를 통해 데이터베이스에서 가져온 날짜로 set할 수 있도록 overloading 을 통해 구현했다.
입고번호도 overloading을 통해서 입고에서 넣어줄 때는 오늘날짜+랜덤번호 를 통해 넣었다.
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을 통해 데이터가 들어가지 않도록 해야한다.