Background Image

FORUM

?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

* 질문 등록 시 다음의 내용을 꼭 기입하여 주세요.
OS
Window7 32bit, Linux 64bit 등
CUBRID Ver.
[cubrid_rel] 수행 결과
CUBRID TOOL Ver.
[도움말]-[버전정보] 확인
응용 환경(API)
java, php, odbc 등 입력

* CUBRID 응용 오류, SQL 오류 또는 SQL 튜닝 관련된 문의는 반드시 다음의 내용을 추가해 주세요. 비밀글이나 비밀 댓글도 가능합니다.
* 저희가 상황을 이해하고, 재현이 가능해야 알 수 있는 문제들이 많습니다. 가능한 정보/정황들을 부탁합니다.
에러 내용 및 재현 방법 재현 가능한 Source와 SQL
관련 테이블(인덱스, 키정보 포함) 정보 CUBRID 홈 디렉토리 아래 log 디렉토리 압축


-------------- 아래에 질문 사항을 기입해 주세요. ------------------------------------------------------------------------
안녕하세요~!

우선 친전할 답변 감사드리고 손수 테스트해주신점 너무 감사드려요.



말씀해주신 방법으로는 해결을 못했는데

우여곡절 끝에 뭐 해결은 했습니다.



다만 DEFERRED UPDATE 문에 약간의 버그가 있는것 같아서 말씀드립니다~!



제가 만드려고 했던 트리거는 

A db,  B db 양방향 동기화 트리거 였습니다.


즉 A db에서 insert,update,delete가 발생하면 B db에 즉각 반영합니다. 

반대로 B db에서 dml 실행시 A db에 즉각반영하는 트리거입니다.



A  db , B db 트리거는 동일 한 구문이며

트리거 안에 javaSp역시target이 되는 db의 url만 다를 뿐  동일한 클래스 파일입니다.


즉 서로가 서로를 물기 때문에 무한 루프를 방지하기 위해 

dml 실행 전 select로 상대 db에 해당 레코드에 대한 검증을 해야합니다.


또 말씀 해주신 방법대로 old ,new 상관명을 사용하면 

컬럼이 만약 10개라면 10개의 파라미터를 인자로 받아야 하기 때문에 상당히 비효율적이며


해당 javaSp는 해당 테이블 맞춤으로 밖에 사용하지 못합니다.

이것이 제가 굳이 select를 한 이유입니다.



여하튼  아래와 같이 CUBRIDOID 객체를 응용해서


create procedure ttt

deferred insert on test

execute call javasp(obj)


obj를 통째로 넘기는 javasp를 구현하긴 하였습니다.




다만 문제는 update할떄의 문제였습니다.


update javaSp로직은 대강


1)obj를 파라미터로 받는다

2)obj에서 기본키 추출

3)타겟이 되는 db에 기본키를 대입하여 해당 레코드 한줄을 불러온다.

4-1)불러온 레코드의 업데이트 컬럼의 값과 입력받은 obj의 업데이트 컬럼 값이 같다면 update완료로 간주하고 실행을 중지한다

4-2)컬럼 값이 다르다면 update를 진행한다.

5-1) javaSp 종료, Trigger 종료


대강 이런식의 로직입니다.



DEFERED 키워드가 커밋이 된 데이터에 대해서만 다루는것이라면

위에 로직은 문제 없이 돌아가야합니다.



이런식으로 한쪽 db에만 javaSp를 올리고 트리거를 등록한후 update를 발생시키면

상대 db에 잘 들어가있습니다. 


문제는


양쪽에 올리고 실행시키는 순간 무한루프에 빠져 lock에 걸립니다.



한줄한줄 로그를 찍어보며 확인해본결과


1) A DB에서 트리거가 발생하고 위에서 말한 4-2)단계를 진행 


2) B DB에서 동일 트리거가 발생하고 위에서 말한 4-1)단계로 가야하는데 가지 못하고 4-2)로 넘어감


    즉 DEFERED 키워드로 인해 A DB 트리거를 동작시킨 레코드가 COMMIT이 된 상태라면

    이 단계에서 업데이트 컬럼의 값이 같아져서 업데이트 실행을 중지해야하는데, 계속 다른걸로 간주됩니다. 즉 COMMIT이 되지 않은 상태라는거죠



제가 뭔가 하자가 있다고 말씀드리는 이유는


INSERT 트리거 역시 DEFERED 키워들 주었으며 위와 동일한 로직입니다.


업데이트 시간컬럼값을 비교하는 부분만 그냥 행이 있나 없나만 비교하는것만 다를 뿐 전체적인 흐름은 동일합니다.


INSERT 트리거 역시 A에서 B호출, B에서 다시 A호출할때 A에서 트리거를 발생시킨 레코드가 COMMIT이 되지 않았다면 무한루프에 빠져야하는데

그러지 않고 제가 구상한 로직대로 잘 진행이 된다는 것 입니다..




여하튼 해결은 


위에서 말한 javaSp의 4-1) 단계로 진입하기전 현재 자신의 커넥션(jdbc:default)에서 방금 업데이트 된 레코드를 select하는 쿼리를 추가하였더니, 그 이후로는 무한루프에 빠지지 않습니다.


다시 말해 javasp에서 default커넥션이 무언가 동작을 해야 commit이 되는것을 확인했습니다.

 



제가 이번에 트리거를 처음 다뤄본것도 있고, 개발 경력이 아주 미비하여..

트랜잭션에 대한 개념이 확실하게 박혀있진 않습니다.


때문에 위에서 말한 상황들이 정상적인 결과라면 뭐.. 죄송합니다!!

  


다만 혹시나 하자가 있을 수 있는 부분이기에.. 해결방법을 공유드립니다.





항상 수고 많으시고, 다시 한번 친절한 답변 감사드립니다~!




  • ?
    오명환 2019.11.06 09:22
    해결책을 찾으셔서 다행입니다. 문의하신 내용에 대해 답변드립니다.

    deferred trigger는 commit 진행될 때 마지막으로 호출되는 trigger입니다. 다른 transaction 입장에서는 아직 commit이 안 된것이라고 볼 수 있죠,
    즉, 변경된 데이타를 읽지 못하는 상태입니다.

    Java SP 사용시 default connection과 connection URL를 사용하는 차이점은 다음과 같습니다.
    * default connection : 현재 사용하고 있는 transaction과 동일한 transaction을 사용하고, JSP 내부에서 commit를 호출하여도 무시
    * connection URL : 현재 사용하고 있는 transaction과 별도의 transaction을 만들어서 사용하고 JSP 내부에서 commit를 호출하면 JSP애서 만든 transaction에 대해서만 commit 발생

    위의 기술한 내용을 보면 connection URL를 사용하셔서 별도의 transaction으로 간주되어 update 되지 않은 데이타를 보면서 발생한 문제인 것 같습니다.
  • ?
    cubridtest 2019.11.07 14:40
    답변감사합니다.

    동기화 대상이 되는 TARGET DB는 URL커넥션, 본인 DB는 default 커넥션입니다.

    deferred가 다른커넥션에서 바라볼때 commit이 안된 데이터라면 제가 구상한 로직이 잘못된게 맞습니다..

    근데 의문인점은 insert 동기화는 잘만 된다는말이죠... 그래서 의문이 생긴겁니다..ㅠ

    예를들자면
    A db < - > B db 동일한 javaSp를 실행시키는 deferred insert 트리거가 있다고 치면

    1) A db에서 insert발생
    2) A db에서 B db에 방금 입력된 행이 있는지 url커넥션으로 select
    3) 당연히 없을테니 B db에 url커넥션으로 insert
    4) 이때 인서트가 B db에서 발생하니 동일한 트리거가 돌면서 B입장에서 1)진입
    5) B db에서 A db에 방금 입력된 행이 있는지 url 커넥션으로 select
    !! 여기서 A DB의 트랜잭션이 종료된게 아니기 때문에 없다고 나와야 정상아닌가요 그럼?.... 이해가 잘안되네요 ㅠ!!
    6) A db에 해당 행이 조회됬다고 나옵니다.
    7) B db javaSp 종료 / 트랜잭션 종료
    8) A db 트랜잭션 종료

    여기서 5번부분이... 답변해주신 내용이랑 상이한 결과라.. 잘 이해가 안되요

    UPDATE 트리거는 답변주신 내용대로 URL커넥션에서 SELECT했을때 COMMIT이 완료되지 않은 값이 나오거든요..
  • ?
    오명환 2019.11.07 15:37
    몇가지 문의를 드립니다.
    (1) transaction 관련 설명을 드린 것은 CUBRID 버전은 10.X 이상 기준으로 이야기를 드린 것입니다. 현재 어떤 version을 사용하고 있는지요 ?

    (2) 작성된 stored procedure 관한 문의입니다.
    - 로컬(A) DB용 connection과 로컬(B) DB용 connection 분리해서 사용하셨는지 ?
    - SP내에서 질의 수행후 commit를 주었는지 ?

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 SQLGate for CUBRID를 사용해 보시기 바랍니다!!! file admin 2019.07.31 335
3068 elastic logstash에서 JDBC로 CUBRID를 연결하는데 계속해서 실패합니다 1 제냐 2019.11.18 18
3067 MSSQL -> CUBRID MIGRATION 현수 2019.11.15 16
3066 cubrid.conf 설정 질문 드립니다. 2 지옥성녀은비 2019.11.12 86
3065 큐브리드에 있는 sql데이터를 다른사이트에 표출하는방법 1 꼴통개발자 2019.11.05 32
3064 Spring Boot 2+ JDBC DB Connection pool 오류 3 daniel 2019.11.05 44
3063 큐브리드 매니저에서 로컬서버 설정후 데이터베이스 생성 할때 창안뜨는 경우 2 나라디 2019.11.04 37
3062 drop table 시 clob 파일 질문입니다. 1 진짜마드리드 2019.11.04 26
» [답변에 대한 답글입니다.] Trigger 이벤트 시점에 대해 질문드립니다. 3 cubridtest 2019.10.31 57
3060 Spring JPA cubrid 연결 오류 질문입니다 3 daniel 2019.10.31 40
3059 Trigger 이벤트 시점에 대해 질문드립니다. 1 cubridtest 2019.10.29 40
3058 An IOException was caught during reading the inputstream. 오류 조치방법 좀 알려주세요. 1 ldev27 2019.10.29 22
3057 안녕하세요 javaSp를 사용한 프로시저 등록 관련하여 질문드립니다. 1 cubridtest 2019.10.28 23
3056 my SQL -> CUBRID로 마이그레이션 작업 중 질문이 있습니다. 1 클라우비 2019.10.25 37
3055 CUBRID 구성 문의 1 file passik89 2019.10.24 44
3054 unload 실행시 Empty component list in class 8 file 휴식 2019.10.22 59
3053 한글깨짐현상 문의드립니다. 1 file 슬픈공돌이 2019.10.22 33
3052 큐브리드 데이터 타입 문의드립니다. 1 피닉스맨 2019.10.14 42
3051 cubrid 함수 에러 질문 1 킁미 2019.10.11 62
3050 macOS Catalina 업데이트 후 큐브리드 매니저 실행안되는 문제 1 norman 2019.10.11 93
3049 데이터베이스 접근 계정 dba 패스워드 분실로 인한 초기화 방법 알고싶습니다. 1 pjs 2019.10.08 34
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 154 Next
/ 154

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2147 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales