제목 | 반복문 트랜잭션에 관련해서 질문드립니다. | ||
---|---|---|---|
카테고리 | CI 4 관련 | ||
글쓴이 | lms | 작성시각 | 2020/01/30 11:05:51 |
|
|||
안녕하세요. CI 반복문 트랜잭션에 관련해서 질문드립니다.
먼저 현재 상황에 대한 설명입니다. foreach 문을 돌면서 조건에 맞으면 update 를 진행하고, 조건이 맞지 않으면 echo "메세지 출력"; 또는 echo "메세지 출력" continue; 가 되도록 되어 있습니다.
이때, foreach 문 안에서 트랜잭션을 적용하기 위해 foreach 문 시작점에 $this->db->trans_start(); 를 해주고, 마지막에 $this->db->trans_complete(); 을 추가하였습니다. 그리고 한건 한건 트랜잭션이 이뤄져야 해서, 완벽모드를 FALSE 해주는 $this->db->trans_strict(FALSE); 도 $this->db->trans_start(); 아래에 추가하였습니다.
그런데, 여기서의 문제는 $this->db->trans_start(); 는 호출 됐지만 조건에 맞지 않아서 continue; 가 됐을 때, update 문이 정상적이여도 전부 롤백되는 현상이 발생했습니다. DB_driver.php 파일을 확인해보니 $this->db->trans_start(); 와 $this->db->trans_complete();을 하면서 $_trans_depth 값을 증가하거나 감소시키는데,continue; 되면서 $this->db->trans_complete();이 호출되지 않아 $_trans_depth 값이 0 이 아니여서 발생하는것인가라고 추측을 했습니다.
그래서 첫번째 질문은 foreach 문안에서 트랜잭션 실행시 $_trans_depth 의 값이 0 이 아니면, 트랜잭션 그룹 안의 쿼리문이 정상적이여도 모두 롤백이 되는게 맞는지? 입니다.(즉, $this->db->trans_start();와 $this->db->trans_complete();을 세트로 맞춰야 하는지입니다.)
만약 $_trans_depth 값을 0 으로 맞춰 줘야 한다면, 두번째 질문은 $_trans_depth 를 0으로 해주기 위해 foreach 문 중간에 continue; 되는 부분에 $this->db->trans_complete(); 을 호출해도 되는지? 입니다. 이와 연관되어 현재 소스상으로 조건에 맞지 않으면 continue; 하는 부분이 한번 이상 설정되어 있는데요. 그때마다 $this->db->trans_complete(); 넣어도 되는지 의문입니다. (8와 9 번째줄 사이, 13와 14 번째줄 사이, 18와 19 번째줄 사이에 넣어도 되는가입니다.)
마지막으로 foreach 문 안에서 트랜잭션을 사용하는게 의미없다라는 글을 CI포럼 글중에서 읽었는데요. 왜 의미가 없는지, 의미가 없다면 어떤방식으로 처리하면 좋을지 의문이 들어서요. 이 부분에 대해서도 답변 주시면 감사하겠습니다.
아래 예제소스 참고 부탁드립니다. 감사합니다.
foreach($list as $data) { $this->db->trans_start(); $this->db->trans_strict(FALSE); if($data['id']) { if($is_duplicate) { echo " 이미 등록된 아이디입니다."; continue; } if($data['title_1']) { echo " 제목(1)이 없습니다."; continue; } if($data['title_2']) { echo " 제목(2)이 없습니다."; continue; } $this->model->update1(); $this->model->update2(); $this->model->update3(); if ($this->db->trans_status() === FALSE) { echo " 등록실패"; flush(); } else { echo " 등록성공"; flush(); } } else { echo "id값이 없습니다."; flush(); } $this->db->trans_complete(); } /* foreach 닫기 */
|
|||
다음글 | ci3 세션 질문드립니다. (2) | ||
이전글 | log_message 함수에 대한 질문입니다. (1) | ||
한대승(불의회상)
/
2020/01/30 18:08:14 /
추천
0
|
lms
/
2020/02/12 17:34:16 /
추천
0
@한대승(불의회상) 답변감사합니다. 답변주신 내용 참고해서 수정해보도록 하겠습니다. |
트랜잭션 시작과 끝 사이에 롤백을 하면 1번 업데이트를 하던 100번 업데이트를 하던 모두 롤백됩니다.