CI 묻고 답하기

제목 Oracle DB에 로우 인서트 후 해당 로우가 사라지는 현상
카테고리 CI 2, 3
글쓴이 버닝 작성시각 2016/11/09 15:13:18
댓글 : 3 추천 : 0 스크랩 : 0 조회수 : 21671   RSS

안녕하세요. 버그를 잡고있는데 어려움을 겪고있어 이렇게 질문드립니다.

 

문제 현상과 관련 환경은 이렇습니다.

- Oracle DB에 로우 인서트 후 웹앱에서 리스트 출력 시 해당 로우가 사라진다.

- 인서트 후 디비 툴(데이터그립)에서 인서트된 로우가 확인되고 웹앱에서 리스트 출력 시 디비 툴에서 인서트 된 로우가 사라진다.

- 소스코드 상에서 last_query() 함수를 통해 실행된 쿼리를 얻어 디비 툴에서 실행하면 웹앱에서 리스트 출력 시 로우가 사라지는 현상은 발생하지 않는다

- 소스코드상의 디비 계정과 디비툴에서의 계정은 동일하다.

 

현재 제가 의심하고 있는 부분은 커밋 부분입니다.

 

그래서 제가 시도한 주된 액션들은 아래와 같습니다. 

1.  

$this->db->trans_start();

쿼리  

$this->db->trans_complete();

 

2.

$this->db->trans_begin();

쿼리

$this->db->trans_commit()

 

3.  

$this->db->query("Main Query");

$this->db->query("COMMIT");

 

혹시 커밋 이슈 외에 다른 부분을 의심할 수 있는 원인이 있을지

또는 제가 취한 액션들 외에 다른 액션들이 있을지 CI 선배님들의 조언을 구하고 싶습니다.

감사합니다.

 

 

 

 다음글 update_batch 이용시 문의 드립니다. (1)
 이전글 페이지네이션 attribute 관련 질문입니다. (4)

댓글

변종원(웅파) / 2016/11/09 16:41:40 / 추천 0

트랜잭션 사이의 쿼리중 하나라도 실패하면 모두 롤백됩니다.

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->trans_complete();

if ($this->db->trans_status() === FALSE)
{
        // generate an error... or use the log_message() function to log your error
}

위 소스를 적용해보세요.

버닝 / 2016/11/09 18:05:15 / 추천 0

답변 감사합니다.

트랜잭션 사이의 쿼리는 하나의 쿼리이고 로직의 결과도 정상적이지만

같은 결과가 발생하네요.


$this->db->trans_start();
$this->db->insert($this->table, $data);
$this->db->trans_complete();
if ($this->db->trans_status() === false) {
     return '실패';// generate an error... or use the log_message() function to log your error
} else {
     $this->db->trans_commit();
     return '성공';
}

위 코드에서 insert 부분도 query() 함수를 사용해봤지만 같은 결과이네요.

무언가 다른 원인이 있을까요?

변종원(웅파) / 2016/11/09 18:17:00 / 추천 0

시스템 파일중 DB_active_rec.php에서 트랜잭션 부분에서 결과값들을 찍어보셔야 할 것 같습니다.

참고하세요. http://blog.robotekindo.net/2010/05/codeigniter-oracle-transaction-bug.html