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