주식회사 누리아이티

정보자산의 보안강화를 위한 다계층 인증SW (BaroPAM) 전문기업.

▶ Tuxedo/기술자료

모 site (Ticket-VAN 업무)에서 발생한 문제.

누리아이티 2012. 2. 29. 14:48

1.Client, Node server, Master server등을 2 Phase Commit(2PC)으로 수행시킬 때 client에서 tpcommit()을 수행하면
  - Node server에 xa_prepare() 수행하도록, Master server에 xa_prepare() 수행하도록 call하고,
  - Node server에 xa_commit() 수행하도록, Master server에 xa_commit() 수행하도록 call하여 xa_prepare(), xa_commit() 모두 OK이면 2PC 수행 !
    => 여기서 xa_prepare()는
       1 Phase commit으로서,  RDB의 변경된 Records를 commit시키는 단계이며 이 때는 commit 혹은 rollback 상태로 남아있게 됨.
       또한 xa_commit()은
       2 Phase commit으로서, RDB의 변경된 Records의 Lock을 해제시키는 단계임.
 
2.만약에 Node/Master server에서 xa_prepare()는 OK이고, Node server에서는 xa_commit() OK이지만     Master server에서 xa_commit() NOK여서 transaction이 pending되어있는 상태로 있을 때
  ORA-2049: time-out: distributed transaction waiting for lock
  ORA-1591: lock held by in-doubt distributed transaction ID 라는 ORACLE ERROR 발생.
            => 해결하기 위해서는
               - TMS_ORACLE7을 2개에서 3 ~ 5개로 늘려서 booting시키고,
               - “ubbconfig” 화일의 OPENINFO에서 SesTm=60 이상으로 설정. (client에서 tpbegin의 time-out 보다는 큰값을 설정).
               - “$ORACLE_HOME/dbs/initORACLE7.ora”  화일에 정의되어 있는 process 수를 증가시킴.
 
3.발생원인
  TMS_ORACLE7 및DB를 사용하는 server들은 booting시 각각 ORACLE session을 2개 사용하는데 ($ sqlplus sys/manager에서 SQL> select sid,process,username from v$session; 으로 확인 가능. 또한 “xa_NULL092595.log” 화일에서 xaostart에서 xaoend까지가 한개의 ORACLE session을 의미함)
  다수의 client에서 많은 Transaction을 발생시키면 ORACLE session이 증가한다. 이 session은 tpcommit() 수행시 release되어야 하는데 ORACLE내에서 session 확보 측면에서 계속 가지고 있음 이런 상태가 계속되면 어느 순간에 “XAER_NOTA” 라는 에러가 발생되고, ORA-2049, ORA-1591 에러가 발생되어 서비스가 중단 됨 !
   -> 정상적인 경우 AP 서버당 Oracle Session 2개가 Connection을 위하여 생성되며, Transaction 발생시 1개의 Session이 추가된다. 만약 여러 클라이언트에서 tpbegin() 한 후 tpcommit()을 하지 않은 Transaction이 발생하면 그 수 만큼 Session이 추가로 발생한다.
      tpcommit()을 하면 추가된 Session은 모두 Release되고 1개의 Session은 Cache State로 남아 있는다.
      이는 다음 Transaction 발생시 빨리 처리하기 위한 것 임
  ORACLE에서 session의 수를 변경하기 위한 parameter는 “$ORACLE_HOME/dbs/initORACLE7.ora”    화일에 process로 정의되어 있음.
  이 값은 실질적인 process 수 * 1.1 + 5 이상을 설정함.