커밋도 프로시저 안에서 처리하셔야 합니다.
"프로시져 후" 가 어떤 의미일까요?
- 1. 실행(EXECUTE) 후 / 2. 컴파일(CREATE) 후
1번의 경우
- 프로시져 내부에 (커밋/롤백) 을 안했다면? (커밋/롤백) 해주셔야 하구요.
- 프로시져 내부에 (커밋/롤백) 을 완료했다면? (커밋/롤백) 안해도 됩니다.
2번의 경우
- CREATE 는 DDL 이므로 자동 커밋됩니다.
그런데 궁금한게 프로시저 내부에 commit; 을 명시하지않아도
프로시저 이용할때 안에 INSERT 문등 자동 커밋되지않나요? (오라클 기준 ..)
그렇다면 프로시저로 인한
데드락과 같은 문제는 일어나지 않겠죠
commit을 따로 명시해줘야지 프로시저 안의 트랜잭션들이 종료 되고
그에 따른 동시성을 높일수 있다고 알고있습니다.
create or replace procedure proc_temp
is
begin
insert into temp_m (temp_sn) values ('a2');
end proc_temp;
이런 프로시저가 있다고 쳤을때
실행한다음 select * from temp_m 하면 데이타가 존재하는걸 확인할수 있습니다.
타 사용자도 존재하는걸 확인하였습니다. 이건 커밋이 된게 아닌건가요?
잘 모르겠네요 .ㅜ
session A에서 프로시저 돌린 결과가 session B에 바로 적용된다는 말씀이시죠?
오라클 기본 설정은 명시적으로 commit해야지 데이터 변경이 완료되는 게 맞습니다. toad나 sql developer 같은 툴에서 프로시저 실행하셨다면 툴 세팅에 autocommit 활성화 되어있지 않은지, 혹은 프로그램단에서 콜했는데도 commit 되셨다면 해당 개발언어에서 autocommit 활성화 세팅되어있는 게 아닌지, 혹은 commit 로직이 숨어있는 게 아닌지 확인해보셔야할 것 같네요.
show autocommit 치면 off 로 되어있습니다만. 흠. ㅜ
툴에서 프로시저 실행하는 건가요? autocommit이 false 더라도 툴 옵션에 autocommit되어있으면 자동 commit입니다. 무슨 툴 쓰세요?
저 같은 경우는 토드 쓰는데 토드 옵션에 oracle-transactions-commit after every statement 체크 되어있으면 쿼리 실행하자마자 commit입니다.
sql developer 사용하고 있습니다.
그런데 INSERT UPDATE DELETE . 쿼리실행하면 COMMIT / ROLLBACK 을 해야 트랜잭션 처리 완료됩니다
프로시저만 오토커밋이 됩니다.
프로시저만 제어하는게 있는지요?
그리고 오늘 몇 동료 개발자및 DBA 한테 관련건을 물어봤는데
프로시저 오토커밋 된다 / 안된다로 갈렸습니다.
그런데 구글링을 해도 프로시저내 AUTOCOMMIT 은 안된다고 되있으니.. 참 ㅜ
oracle 파라메터 autocommit은 단일 dml에서만 작동하는 게 맞는 것 같고
툴에서 단일 dml도 commit을 해야 적용된다면 남는 건 procedure단에서 어디선가
commit을 하고 있다는 것인데..
해당 트랜잭션에서 commit되는 부분을 찾으셔야할 것 같네요.
procedure A 에서 B를 call하고 B에서 C를 call하고 이러한 구조로 되어있어서 찾기 어려우신 거 아닌가요?
프로시저내에 콜하는 구조는 아니고 위에 작성한 프로시저가 다입니다.
begin
proc_temp();
end;
좀있다가 다른 오라클 환경에서 테스트 해보려구요. ㅋ
만약 원인이 밝혀진다면 내용 공유하겠습니다. 답변 감사합니다. ㅎ