수업내용/SQL

[2022.10.25.화] 트랜잭션

주니어주니 2022. 10. 25. 19:41

 

 

1. 트랜잭션

 

  • 여러 번의 데이터베이스 액세스 작업을 하나의 논리적인 작업단위로 묶는것

  • 트랜잭션 처리 대상 SQL 명령어 : INSERT, UPDATE, DELETE

  • 트랜잭션의 논리적인 작업단위
    • 예시) 주문작업

      1. 주문정보 저장                                            - INSERT
      2. 주문상품 정보 저장                                    - INSERT
      3. 결제정보 저장                                            - INSERT
      4. 배송정보 저장                                            - INSERT
      5. 상품재고현황 변경                                     - UPDATE
      6. 고객의 적립포인트 변경                             - UPDATE
      7. 고객의 적립포인트 변경 이력정보 저장     - INSERT 

    • 주문작업은 7번의 데이터베이스 변경(INSERT, UPDATE, DELETE) 작업으로 구성되어 있다.
    • 주문작업의 논리적인 작업단위는 5번의 INSERT작업과 2번의 UPDATE 작업으로 구성되어 있다.
    • 주문작업은 위의 7번의 데이터베이스 액세스 작업 중 하나라도 오류가 발생하면 주문작업이 완료되지 못한 것
    • 논리적인 작업단위로 묶인 7번의 데이터베이스 액세스 작업은 항상 ALL OR NOTHING의 2가지 처리상태가 존재
    • 논리적인 작업단위로 묶인 데이터베이스 액세스 작업에 대한 부분적인 성공을 허용하지 않는다.
      (데이터의 일관성이 깨짐)
      * 묶은 이유 -> ALL 아니면 NOTHING 으로 처리할려고,
        전부 하거나, 하나라도 오류가 나면 아예 취소

  • 트랜잭션(논리적인 작어단위) 처리 명령어
    • COMMIT
      : 트랜잭션 내의 모든 DML(INSERT, UPDATE, DELETE) 실행결과를 데이터베이스에 영구 반영
    • ROLLBACK
      : 트랜잭션 내의 모든 DML(INSERT, UPDATE, DELETE) 실행결과의 데이터베이스 반영을 전부 취소

  • 트랜잭션(논리적인 작업단위)의 시작과 종료
    • 트랜잭션의 시작
      : 첫번째 DML 명령이 실행될 때 새 트랜잭션이 자동으로 시작 (아직 DB반영은 아님)

    • 트랜잭션의 종료
      : COMMIT/ROLLBACK 명령이 실행될 때 기존 트랜잭션 종료, 새로운 트랜잭션 시작 

  • 트랜잭션의 성질
    • 원자성(Atomicity) : 트랜잭션과 관련된 작업들은 부분적인 성공을 허용하지 않는다. (하나의 작업단위) 
    • 일관성(Consistency) : 트랜잭션이 종료되면 데이터는 언제나 일관성을 유지하는 상태가 된다. (커밋이면 커밋)
    • 고립성(Isolation) : 트랜잭션 수행시 다른 트랜잭션이 끼어들 수 없다.
    • 지속성(Durability) : 성공적으로 수행된 트랜잭션은 데이터베이스에 영구적으로 반영된다.

 

 

--------------------------------------------------------------------------------
-- 트랜잭션 
--------------------------------------------------------------------------------

-- 류관순 사용자가 71번, 91번 상품을 장바구니에 저장 
insert into sample_cart_items (user_id, product_no, item_amount) values ('ryu', 71, 1);     --트랜잭션 시작(아직 db반영 x)
insert into sample_cart_items (user_id, product_no, item_amount) values ('ryu', 91, 2);

-- 71번, 81번 상품의 재고수량 변경 
update sample_products
set
    product_stock = product_stock - 1
where product_no = 71;

update sample_products
set 
    product_stock = product_stock - 1
where product_no = 91;

commit;     -- > 이 때 트랜잭션 내의 모든 dml 작업 실행결과를 db에 영구적으로 반영
-------------------------------------------------------------------------------- 트랜잭션 종료 / 새 트랜잭션 시작

rollback;   -- > 새 트랜잭션 내의 모든 dml 작업 실행결과의 db 반영을 모두 취소
            -- 위에서 실행된 insert, update의 db 반영을 취소할 수는 없다. (다른 트랜잭션이기 때문)
            -- 이 트랜잭션 내에서는 dml 작업을 하나도 수행하지 않았기 때문에 취소할 작업도 하나도 없음
            
-------------------------------------------------------------------------------- 트랜잭션 종료 / 새 트랜잭션 시작

insert into sample_users (user_id, user_password, user_name, user_email)
values ('ahn', 'zxcv1234', '안중근', 'ahn@hanmai.net'); 

insert into sample_cart_items (user_id, product_no, item_amount) values ('ahn', '81', 5);

update sample_products
set
    product_stock = product_stock - 5
where product_no = 81;

select * 
from sample_users;

select *
from sample_cart_items;

select *
from sample_products;

rollback;   -- > 트랜잭션 내의 모든 dml 작업 실행결과의 db 반영을 모두 취소
-------------------------------------------------------------------------------- 트랜잭션 종료 / 새 트랜잭션 시작