본문 바로가기

데이터베이스/Oracle

Sequence 객체와 트랜잭션

1. Sequence객체 : 일련번호 발급용 객체

--SUBQUERY에서 사용못함
CREATE SEQUENCE order_seq; -- 시작은 1부터 1씩 증가

알아서 만들어짐

CREATE SEQUENCE test_seq; 
DROP SEQUENCE test_seq; --삭제
CREATE SEQUENCE test_seq
START WITH 11
INCREMENT BY 2 --2씩 증가
MAXVALUE 30
MINVALUE 0
CYCLE;--MAXVALUE 넘어서면(31인 경우) MINVALUE로 돌아감

CACHE - 20개의 숫자를 미리 저장
1 CYCLE(11 13 15 17 19 21 23 25 27 29) 갯수가 20개보다 작음
예를 들어 캐시를 20개 만들어둬서 (1~20) 1를 썼는데 중간에 날아가서 다음 숫자가 21이 오는 경우도 있음

--위의 문제 NOCACHE로 해결
CREATE SEQUENCE test_seq
START WITH 11
INCREMENT BY 2 
MAXVALUE 30
MINVALUE 0
NOCACHE
CYCLE;
--일련번호 발급하기
SELECT test_seq.NEXTVAL FROM dual; --11
SELECT test_seq.NEXTVAL FROM dual; --13
SELECT test_seq.NEXTVAL FROM dual; --15
SELECT test_seq.NEXTVAL FROM dual; --17
SELECT test_seq.NEXTVAL FROM dual; --19
SELECT test_seq.NEXTVAL FROM dual; --21
SELECT test_seq.NEXTVAL FROM dual; --23
SELECT test_seq.NEXTVAL FROM dual; --25
SELECT test_seq.NEXTVAL FROM dual; --27
SELECT test_seq.NEXTVAL FROM dual; --29
SELECT test_seq.NEXTVAL FROM dual; --0
SELECT test_seq.NEXTVAL FROM dual; --2

맨 마지막꺼

--현재일련번호 확인하기:NEXTVAL 사용 후에만 사용 가능하다.
SELECT test_seq.CURRVAL FROM dual;

결과
NEXTVAL (넥스트밸류) 안하고 CURRVAL(커런트밸류)하면 에러

SELECT * FROM order_info;
--       ↓
DROP SEQUENCE order_seq;

CREATE SEQUENCE order_seq
START WITH 4;
--주문기본정보추가
INSERT INTO order_info(order_no, order_id) VALUES (order_seq.NEXTVAL, 'A');
SELECT * FROM order_info;

4번부터 생성

--주문상세정보추가
INSERT INTO order_line(order_line_no, order_prod_no, order_quantity) VALUES (order_seq.CURRVAL, 'C0001', 1);
INSERT INTO order_line(order_line_no, order_prod_no, order_quantity) VALUES (order_seq.CURRVAL, 'F0001', 2);
SELECT * FROM order_line;

결과


2. 트랜잭션 : 작업단위

계좌이체작업
1) A계좌에서 100원이 출금 UPDATE account SET balance=balance-100 WHERE no='A'; --1건처리
2) 100원이 B계좌로 입금 UPDATE account SET balance=balance+100 WHERE no='B'; --0건처리 (B계좌 없음)
→ B계좌 없어서 실패한 건이니까 COMMIT 하면 안되고 1번 ROLLBACK 해야한다

 

DDL(CREATE/ALTER/DROP)은 트랜잭션 자동종료 --그때그때 실제 DB에 반영
DML(INSERT/UPDATE/DELETE)은 트랜잭션 자동완료안됨 - 수동종료 - 원상태로 복구(ROLLBACK)/완료(COMMIT)

 

INSERT INTO order_line(order_line_no, order_prod_no, order_quantity) VALUES (order_seq.CURRVAL, 'C0001', 1);
INSERT INTO order_line(order_line_no, order_prod_no, order_quantity) VALUES (order_seq.CURRVAL, 'F0001', 2);
ROLLBACK; --위에껄 ROLLBACK
--트랜잭션 시작하기 전(추가 삭제 변경) 전부 ROLLBACK / CREATE SEQUENCE는 살아있음
SELECT * FROM order_line;
--ROLLBACK결과, SEQUENCE랑은 관계 없어서 SEQUENCE는 ROLLBACK안됨 테이블의 자료만 ROLLBACK

'데이터베이스 > Oracle' 카테고리의 다른 글

JDBC 사용해보기  (0) 2023.08.23
JDBC 드라이버 설치하기  (0) 2023.08.23
exerd 플러그인 활용하기  (0) 2023.08.23
정규화 예제  (0) 2023.08.23
정규화  (0) 2023.08.23