CI 묻고 답하기

제목 반복문 트랜잭션에 관련해서 질문드립니다.
카테고리 CI 4 관련
글쓴이 lms 작성시각 2020/01/30 11:05:51
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 13116   RSS

안녕하세요. 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

트랜잭션 시작과 끝 사이에 롤백을 하면 1번 업데이트를 하던 100번 업데이트를 하던 모두 롤백됩니다.

 

lms / 2020/02/12 17:34:16 / 추천 0

@한대승(불의회상) 

답변감사합니다. 답변주신 내용 참고해서 수정해보도록 하겠습니다.