개발 Q&A

제목 트랜잭션 반복문 사용시 문제
카테고리 PHP
글쓴이 cnpwis 작성시각 2020/01/06 16:23:52
댓글 : 8 추천 : 1 스크랩 : 0 조회수 : 1148   RSS

안녕하세요.

아무리 인터넷 서치를 해도 답을 알수가 없어 문의 드립니다.

우선 가비아 독립몰 솔루션을 사용중에 있습니다.

현 문제는 200여개의 주문 리스트를 일괄 처리해야하는데

for ($i=0; $i < count($orders); $i++) {

 $this->pay();

}

function pay(){ // 주문 실행 함수입니다.

   $this->db->trans_begin();

      주문 데이터 INSERT 쿼리 등등

      if ($this->db->trans_status() === FALSE || $rollback == true){

         $this->db->trans_rollback();

      }else{

          $this->db->trans_commit();

      }

}

위와 같은 형태로 일괄 처리 하고 있는데 만약 100건째에 오류가 나면

그 뒤로 모든 주문건이 롤백 처리 되고 있는 상황입니다.

 

질문 1. 해당 오류건만 롤백 후 나머지 주문건은 정상 처리 되도록 할 수 있는 방법이 있을까요?

       메뉴얼에 있는 $this->db->trans_strict(FALSE); 설정을 해도 마찬가지입니다.

질문 2. 주문 루프가 도는 동안 다른 주문건에 의해 중복 처리로 트랜잭션 되는줄 알았는데

      쿼리로그를 찍어봐도 문제될 곳이 없어보입니다. 혹시 트랜잭션이 걸리는 이유가 쿼리 오류 말고 다른게 있을지 궁굼합니다.

 

두서 없이 질문을 올렸는데 제발 답변 부탁드립니다.

정말 해결하고 싶습니다.

고맙습니다.

 다음글 암호화, 복호화 문의 드립니다. (4)
 이전글 파라미터 변조에 대한 ci 대응법이 있을까요? (3)

댓글

배강민 / 2020/01/06 16:32:06 / 추천 0

흠 좀 이상하네요.

코드만 봐서는 1개의 주문당 트랜젝션이 걸려있으므로 다른 주문건에는 영향을 안줄듯해 보이는데,

혹시 오류난 이후의 주문건들이 insert등을 했다가 롤백하고 있긴 한건가요? insert조차 못하고 해당 루프 자체가 죽어버리는 건 아닌가요?

cnpwis / 2020/01/06 16:54:55 / 추천 1

답변 감사합니다.

우선 롤백시 쿼리 로그가 남지 않아 쿼리문을 호출해서 로그로 남겨 봤는데 일단 실행은 다 되고 있고 루프도 $this->db->trans_status()이 false 상태로 끝까지 도는 것을 확인 했습니다. 다른 이유가 있을까요? 답답합니다..

한대승(불의회상) / 2020/01/06 17:11:04 / 추천 0
$this->db->trans_strict(FALSE); 를 어느 지점에서 했을까요?
cnpwis / 2020/01/06 17:12:51 / 추천 0

$this->db->trans_strict(FALSE); 는 for문 안에 $this->db->trans_begin(); 전후로 다 붙여 봤습니다. 그래도 결과는 마찬가지였습니다.

엽토군 / 2020/01/07 00:56:37 / 추천 0
1) trans_complete()를 안쓰신 이유가 있나요? 매뉴얼에 따르면 이 메소드는 기본 성공/실패 처리가 있는데요.
2) 소스를 까보니 conn_id 가 문제가 되는것 같습니다. https://github.com/bcit-ci/CodeIgniter/blob/0db8b60492cc98ef3c85b986fc11e9dac6d7ca6c/system/database/drivers/sqlsrv/sqlsrv_driver.php#L217
정 안되면 처리 시작할 때마다 reconnect를 해보세요.
cnpwis / 2020/01/07 10:00:35 / 추천 0

엽토군님 답변 감사합니다~ 얘기해주신대로 trans_complete()와 $this->db->reconnect();로 처리했습니다.

정말 정말 고맙습니다 ^^

그런데 conn_id가 문제가 된다는 말씀이 무엇인지 이해가 안되서요; ㅎ 혹시 중복처리되서 문제가 된다는 말씀이신가요?

엽토군 / 2020/01/07 14:17:00 / 추천 0

음.. 저도 잘은모르지만.. 문제가됐던 몇백개의 트랜잭션들이 결국 최초 1회의 커넥션에 모두 물려있었기 때문에 (= 1개의 같은 커넥션아이디에 할당됐기때문에) 하나가 뻑나면 다같이 뻑나는 그런 현상이었던게 아닐까 뭐 그런뜻이었습니다. (이건 짐작이고.. 실제 이게 원인인지는 잘모르겠습니다.)

해결이 됐다니 다행입니다.

cnpwis / 2020/01/07 14:24:52 / 추천 0
엽토군님 진심으로 감사드립니다. :)