Sql 프로시저 후 commiy 꼭 해줘야 하나요??? 12

by 정우성 [2017.01.04 16:01:59]


Sql 프로시저 후 commiy 꼭 해줘야 하나요???

by swlee [2017.01.04 16:18:21]

커밋도 프로시저 안에서 처리하셔야 합니다.


by 마농 [2017.01.04 16:31:59]

"프로시져 후" 가 어떤 의미일까요?
   - 1. 실행(EXECUTE) 후 / 2. 컴파일(CREATE) 후
1번의 경우
   - 프로시져 내부에 (커밋/롤백) 을 안했다면? (커밋/롤백) 해주셔야 하구요.
   - 프로시져 내부에 (커밋/롤백) 을 완료했다면? (커밋/롤백) 안해도 됩니다.
2번의 경우
   - CREATE 는 DDL 이므로 자동 커밋됩니다.


by 달라쏭 [2017.01.04 18:23:35]

그런데 궁금한게 프로시저 내부에 commit; 을 명시하지않아도

프로시저 이용할때 안에 INSERT 문등 자동 커밋되지않나요? (오라클 기준 ..)

 


by ley [2017.01.04 20:28:37]

그렇다면 프로시저로 인한 

데드락과 같은 문제는 일어나지 않겠죠

commit을 따로 명시해줘야지 프로시저 안의 트랜잭션들이 종료 되고

그에 따른 동시성을 높일수 있다고 알고있습니다. 


by 마농 [2017.01.04 23:50:00]
자동 커밋되지 않습니다.

by 달라쏭 [2017.01.05 11:22:21]
create or replace procedure proc_temp
is

begin
    insert into temp_m (temp_sn) values ('a2');

end proc_temp;

 

이런 프로시저가 있다고 쳤을때

실행한다음  select * from temp_m 하면 데이타가 존재하는걸 확인할수 있습니다.

타 사용자도 존재하는걸 확인하였습니다.  이건 커밋이 된게 아닌건가요?

잘 모르겠네요 .ㅜ


by jkson [2017.01.05 11:29:17]

session A에서 프로시저 돌린 결과가 session B에 바로 적용된다는 말씀이시죠?

오라클 기본 설정은 명시적으로 commit해야지 데이터 변경이 완료되는 게 맞습니다. toad나 sql developer 같은 툴에서 프로시저 실행하셨다면 툴 세팅에 autocommit 활성화 되어있지 않은지, 혹은 프로그램단에서 콜했는데도 commit 되셨다면 해당 개발언어에서 autocommit 활성화 세팅되어있는 게 아닌지, 혹은 commit 로직이 숨어있는 게 아닌지 확인해보셔야할 것 같네요.


by 달라쏭 [2017.01.05 14:15:30]

show autocommit 치면 off 로 되어있습니다만. 흠. ㅜ

 


by jkson [2017.01.05 14:41:57]

툴에서 프로시저 실행하는 건가요? autocommit이 false 더라도 툴 옵션에 autocommit되어있으면 자동 commit입니다. 무슨 툴 쓰세요?

저 같은 경우는 토드 쓰는데 토드 옵션에 oracle-transactions-commit after every statement 체크 되어있으면 쿼리 실행하자마자 commit입니다.


by 달라쏭 [2017.01.05 15:10:06]

sql developer 사용하고 있습니다.

그런데 INSERT UPDATE DELETE . 쿼리실행하면 COMMIT / ROLLBACK 을 해야 트랜잭션 처리 완료됩니다

프로시저만 오토커밋이 됩니다.

프로시저만 제어하는게 있는지요?

그리고 오늘 몇 동료 개발자및 DBA 한테 관련건을 물어봤는데

프로시저 오토커밋 된다 / 안된다로 갈렸습니다.

그런데 구글링을 해도 프로시저내 AUTOCOMMIT 은 안된다고 되있으니..  참 ㅜ


by jkson [2017.01.05 15:38:23]

oracle 파라메터 autocommit은 단일 dml에서만 작동하는 게 맞는 것 같고

툴에서 단일 dml도 commit을 해야 적용된다면 남는 건 procedure단에서 어디선가

commit을 하고 있다는 것인데..

해당 트랜잭션에서 commit되는 부분을 찾으셔야할 것 같네요.

procedure A 에서 B를 call하고 B에서 C를 call하고 이러한 구조로 되어있어서 찾기 어려우신 거 아닌가요?


by 달라쏭 [2017.01.05 16:05:24]

 프로시저내에 콜하는 구조는 아니고 위에 작성한 프로시저가 다입니다.

 begin 
      proc_temp(); 
  end;

  좀있다가 다른 오라클 환경에서  테스트 해보려구요. ㅋ

  만약 원인이 밝혀진다면 내용 공유하겠습니다. 답변 감사합니다. ㅎ

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입