수업/DB

230620 트랜잭션, 스냅샷, 커밋

보더96 2023. 6. 20. 17:12

오라클DB -> 포트를 통해 자바 -> JDBC드라이버

자바 애플리케이션을 이용해 송수

 

다른컴퓨터에 접속

오른쪽 초록색 + 누르기 -> 

아이피주소 그 컴퓨터의 아이디 비번 포트 누르고 접속!

 

SQL PLUS

SQL DEVELOPER 일반종료, 안전하게 종료 할때는 COMMIT이 되는데

강제종료가 되면 자동 COMMIT이 되는걸 보장할수 없다. (ex 정전)

 

 

트랜잭션 : 일처리 작업단위

ㅡ 원자성

ㅡ 일관성

ㅡ 격리성

ㅡ 지속성

 

ex)  계좌이체작업

     ( A계좌에서 출금 ㅡ> B계좌로 입금 )  정상적으로 끝내야 계좌이체 작업이 끝난다.

 

 

 

CREATE TABLE account (no varchar2(3) primary key, balance number(6));
--테이블생성
INSERT INTO account (no, balance) VALUES ('101', 100);
INSERT INTO account (no, balance) VALUES ('102', 100);

--101번 계좌, 102번 계좌 생성
commit;       --트랜잭션완료 (DB에 반영)
UPDATE account SET balance = balance-10 WHERE no='101';
UPDATE account SET balance = balance+10 WHERE no='102';

--101번계좌에서 10출금해서 102번계좌에 10입금

commit;       --트랜잭션완료 (DB에 반영)

UPDATE account SET balance = balance-10 WHERE no='101';  -- 성공
UPDATE account SET balance = balance+10 WHERE no='xxx';  -- 실패

--없는 계좌번호에 입금해서 DB에 반영안됨

UPDATE account SET balance = balance-10 WHERE no='105';  -- 실패
UPDATE account SET balance = balance+10 WHERE no='102';  -- 성공

--없는 계좌번호에서 돈을 출금해서 DB에 반영안됨

ROLLBACK;

--위에 실패한기 전단계로 롤백해줌 (복구,취소를 해줌)

 

 

INSERT INTO account (no, balance) VALUES ('103', 0);
SAVEPOINT p1;
UPDATE account SET balance = balance+10 WHERE no='103';
SAVEPOINT p2;
DELETE account WHERE no='103';          --103계좌 삭제
ROLLBACK;            --트랜잭션이 시작된곳으로 롤백된다
ROLLBACK TO p2;                     --p2까지만 롤백이 된다.
--ROLLBACK TO p1;                   --p1까지만 롤백이 된다.

--롤백p2를 하면 103계좌에 10 더한 가격까지 나온다

--delete를 진행해도 롤백때문에 103계좌가 복구된다.

--롤백p1을 하면 103계좌 생성이라 0원이 나온다

ROLLBACK;
SELECT * FROM account;

--위 쿼리를 실행하게 되면 103계좌가 생기기 전으로 롤백된다.

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

트랜잭션의 데드락상태(롤백해준다)

sql developer 에서 101 삭제하고

cmd 명령프롬프트에서 102 삭제해서

sql developer 에서 select*from account;를 실행하게 되면

102번계좌가 살아있는것을 볼수 있다.

 

롤백해서 다시 101, 102 를 살린다

 

sql developer에서 102를 삭제하고

cmd 명령프롬프트에서 101을 삭제하면

sql developer에서 계속 로딩이 돈다

 

한트랜잭션(sql developer)에서 삭제한것을 다른 트랜잭션(cmd)에서 또 삭제를 하게되면

데드락상태에 빠지게된다! (sql developer에서 계속 로딩이 돈다 - 이러한 현상)

 

왼쪽(sql developer)에서 삭제, 오른쪽(cmd)에서 삭제 후 왼쪽(sql developer)에서 밑에를 삭제 하게되면 데드락 상태에 빠지게된다.

데드락 상태에 걸리게 되면 문제가 생긴 트랜잭션의 락을 풀거나,

롤백을 시켜서 데드락 상태 전으로 만들어줘야한다.

스냅샷을 없앤다

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

스냅샵과 커밋

  • 스냅샷(Snapshot):
  • 데이터베이스의 특정 시점에서 데이터 상태를 나타내는 일종의 "사진".
    트랜잭션을 시작하기 전에 데이터베이스의 스냅샷이 생성되며, 해당 스냅샷은 트랜잭션 동안 일관된 데이터 상태를 유지
  • 커밋(Commit):
  • 트랜잭션(Transaction)의 변경 내용을 DB에 영구적으로 저장하는 작업을 의미

    커밋을 수행하면 이전에 실행한 SQL 문의 결과가 데이터베이스에 반영되며, 해당 트랜잭션은 종료.
    커밋을 호출하기 전까지는 해당 트랜잭션 내에서만 변경 내용이 임시로 유지되며, 다른 세션 또는 트랜잭션에서는 해당 변경 내용을 볼 수 없다.
    커밋 이후에는 변경된 데이터가 다른 사용자나 세션에서도 볼 수 있게 됨.

쉽게 말하면 스키마에 접속이 되서 DML작업(SELECT, INSERT...)을 진행하려고 하면 데이터베이스의 실제 자료에 대한 스냅샷을 가져오게 된다. 스냅샷을 가지고 진행된 작업을 실제 DB에 적용하려고 하면 커밋을 해야한다. 이후 커밋된 자료를 가지고 또 DML작업을 진행하려고 하면 최근 적용된 스냅샷을 가지고 작업을 하는 원리

 

 

 

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

JDBC

Oralce Java DB Connect

 

DB -> 이클립스 연동방법

 

//1. JDBC드라이버 로드

//2. DB연결

//3. SQL구문을 오라클서버로 송신

//4. 송신결과 수신

//5. 결과 활용

//6. DB연결해제

 

classpath -> add -> ojdbc 11버젼 연결 -> apply -> run as실행시키면 오류없

 

 

 

SELECT *
FROM ( SELECT rownum rn, a.*
    FROM ( SELECT *
        FROM product
        ORDER BY prod_name) a
        )
WHERE rn BETWEEN 4 AND 6;  --4와6사이 값을 나오게 추출

 

 

DB에서 이클립스로 파일 로드할때 필요한 함수

 

JDBCTest

송신 :

DML (INSERT/ UPDATE/DELETE) - 처리건수반환

DDL (CREATE/ALTER/DROP) - 0반환

 

자바에서 sql문법만들때  :   prodNO 다음 ""안에 작은따옴표 하나 들어간다

 

?를 사용해서 sql문법이 더 간결하게 나온

 

 

 

 

 

오늘 수업 개망...