본문 바로가기

SQL/Oracle

[Oracle] 트랜젝션(transaction)

728x90

트랜젝션(transaction)
    - DBMS에서 발생하는 1개 이상의 명령어들을 논리집합으로 묶어놓은 단위
    - 트랜젝션에 의해 관리되는 명령어 : DML(insert, update, delete)만 포함 -> 데이터에 조작을 가하는 명령어
    
트랜젝션 관리
    - commit : DB반영
    - rollback : 처음으로 되돌림
    - savepoint : 저장단위
    
auto commit(기본)
    - 자동 저장 기능
    - 모든 insert, update, delete를 각각 실행할 때마다 commit가 바로 이어서 실행됨
    - rollback 불가능

 

테이블 복사 생성

    create table 테이블명 as select 복사할 컬럼명1, 복사할 컬럼명2, ... from 복사할 테이블명

create table tb_member_copy
as
select mem_idx, mem_userid, mem_userpw, mem_name, mem_gender, mem_regdate from tb_member;

테이블 조회

select * from tb_member_copy;

 

 

auto commit 해제

set autocommit off; -- auto commit을 해제

 

데이터 삭제

delete from tb_member_copy where mem_idx in (1, 2);

삭제된 데이터 복구

rollback;

 

데이터 삭제

delete from tb_member_copy where mem_idx in (1, 2);

commit

commit;

DB에 반영하였으므로 rollback 해도 삭제된 데이터가 복구되지 않음

 

savepoint 생성

delete from tb_member_copy where mem_userid = 'avocado';
savepoint a;

delete from tb_member_copy where mem_userid = 'cherry';
savepoint b;

savepoint a로 rollback

rollback to a; -- a지점으로 이동 cherry만 rollback

 


update 프로시저 생성

create or replace procedure proc_member_Addr (
    p_userid in varchar2,
    p_address1 in varchar2,
    p_address2 in varchar2,
    p_address3 in varchar2
)
is
    begin
        update tb_member set mem_address1=p_address1, mem_address2=p_address2, mem_address3=p_address3 where mem_userid=p_userid;
    exception
        when others then
            rollback;
            dbms_output.put_line('SQL EXCEPTION');
end proc_member_Addr;

데이터 수정

exec proc_member_addr('apple', '부산', '해운대구', '해운대앞');

 

 


 

포인트 컬럼 추가

 

업데이트 개수확인용 프로시저 생성

create or replace procedure proc_member_update_count
(
    p_userid in varchar2,
    p_point in number,
    o_update_cnt out number
)
is 
    update_cnt number;
begin
    update tb_member set mem_point = mem_point + p_point where mem_userid = p_userid;
    update_cnt := SQL%ROWCOUNT; -- SQL%ROWCOUNT : 몇 개의 행이 반영되었는지 반환
    o_update_cnt := update_cnt;
exception
    when others then
        rollback;
        dbms_output.put_line('SQL EXCEPTION');
end proc_member_update_count;

 

'apple' 유저 1000포인트 추가

declare
    out1 number;
begin
    proc_member_update_count('apple', 1000, out1);
    dbms_output.put_line(out1);
end;

업데이트 개수 반환

 

결과

 

728x90

'SQL > Oracle' 카테고리의 다른 글

[Oracle] Oracle 함수  (0) 2022.06.16
[Oracle] 커서(cursor)  (0) 2022.06.16
[Oracle] 프로시저 예제  (0) 2022.06.16
[Oracle] 프로시저(procedure)  (0) 2022.06.16
[Oracle] 예외 처리(Exception)  (0) 2022.06.16