트랜젝션 오류

트랜젝션 오류

QA

트랜젝션 오류

본문

코드가 좀 길긴 하나, 트랜젝션이 정상적으로 이루어지지 않고,, 마지막 페이지 데이터 입력만 정상적으로 처리 됩니다.

코드가 잘못된 것인지, 아니면, my.ini에서 별도의 설정이 있어야 하는지 궁금합니다.

 


sql_query(" SET autocommit=0 "); // transaction 설정(시작)
$twoblock_num = get_next_num($write['twoblock_table']); // 글 번호
// 데이터 입력
$twoblockSql = " INSERT INTO `{$write['twoblock_table']}`
	SET wr_num = '$twoblock_num',					-- 글 번호
			ca_name = '$twoblockCat', 				-- 카테고리
			wr_subject = '$presentTitle',			
			wr_content = '$presentContent',		
			mb_id = '{$mb['mb_id']}',			-- 회원아이디
			wr_password = '{$mb['mb_password']}',		-- 회원비밀번호
			wr_name = '{$mb['mb_nick']}',			-- 회원 닉네임
			wr_email = '{$mb['mb_email']}',			-- 회원 이메일
			wr_datetime = '".G5_TIME_YMDHIS."',		-- 작성일
			wr_last = '".G5_TIME_YMDHIS."',			-- 수정일
			wr_ip = '{$_SERVER['REMOTE_ADDR']}',		-- ip
			wr_1 = '{$twoblockTag}',					-- 태그
			wr_2 = '$wr_2',
			wr_3 = '$wr_3',
			wr_4 = '$wr_4',
			wr_5 = '$wr_5',
			wr_6 = '$wr_6',
			wr_7 = '$wr_7',
			wr_8 = '$wr_8',
			wr_9 = '$wr_9',
			wr_10 = '$wr_10' ";
$twoblockInsert1 = sql_query($twoblockSql);

$wr_id = mysql_insert_id();

// 부모 아이디에 UPDATE
$twoblockInsert2 = sql_query(" update `{$write['twoblock_table']}` set wr_parent = '$wr_id' where wr_id = '$wr_id' ");
// 새글 INSERT
$twoblockInsert3 = sql_query(" insert into {$g5['board_new_table']} ( bo_table, wr_id, wr_parent, bn_datetime, mb_id ) values ( '{$twoblock_table}', '{$wr_id}', '{$wr_id}', '".G5_TIME_YMDHIS."', '{$mb['mb_id']}' ) ");
// 게시글 1 증가
$twoblockInsert4 = sql_query(" update {$g5['board_table']} set bo_count_write = bo_count_write + 1 where bo_table = '{$twoblock_table}' ");

// 이미지 업로드시(이미지는 하나만 업로드 됨)
/*
$twoblockInsert5 = sql_query(" update `{$write['twoblock_table']}` set wr_file = 1 where wr_id = '$wr_id' ");
*/

// 데이터 입력
$materialSql ="";
$materialInsRst = array();

for($i = 0; $i < $materialCnt; $i++){
	$materialSql = " INSERT INTO `{$write['material_table']}`
			SET mtr_parent_id = '{$wr_id}', 					-- 연동 가이드 아이디
				mtr_ori_idx = '{$materialArr[$i]->originalIndex}',		-- 등록번호
				mtr_crt_idx = '{$materialArr[$i]->currentIndex}',		-- 보기순서
				mtr_subject = '{$materialArr[$i]->nameAndCount}',	-- 
				mtr_PO = '{$materialArr[$i]->whereBuy}'			-- 구매처
				";

	$materialInsRst[$i] = sql_query($materialSql);

	$mtr_id = mysql_insert_id();

	// 이미지 업로드시(이미지는 하나만 업로드 됨)
	/*
	sql_query(" update `{$write['material_table']}` set mtr_file = 1 where mtr_id = '$mtr_id' ");
	*/
}//end for

// 페이지 데이터 입력
$tpageSql ="";
$tpageInsRst = array();

for($i = 0; $i < $tpageCnt; $i++){
	$tpage_num = get_next_num($write['tpage_table']); // 글 번호
	$tpageSql = " INSERT INTO `{$write['tpage_table']}`
		SET wr_num = '$tpage_num',					-- 글 번호
				wr_parent = '$wr_id',				-- 아이디
				ca_name = '$twoblockCat', 				-- 카테고리
				wr_subject = '$presentTitle',			-- 제목
				wr_content = '{$tpageArr[$i]->twoblockText}',			-- 가이드 소개글
				mb_id = '{$mb['mb_id']}',			-- 회원아이디
				wr_password = '{$mb['mb_password']}',		-- 회원비밀번호
				wr_name = '{$mb['mb_nick']}',			-- 회원 닉네임
				wr_email = '{$mb['mb_email']}',			-- 회원 이메일
				wr_datetime = '".G5_TIME_YMDHIS."',		-- 작성일
				wr_last = '".G5_TIME_YMDHIS."',			-- 수정일
				wr_ip = '{$_SERVER['REMOTE_ADDR']}',		-- ip
				wr_1 = '{$tpageArr[$i]->originalIndex}',		-- 페이지 번호
				wr_2 = '',
				wr_3 = '',
				wr_4 = '',
				wr_5 = '$wr_5',
				wr_6 = '$wr_6',
				wr_7 = '$wr_7',
				wr_8 = '$wr_8',
				wr_9 = '$wr_9',
				wr_10 = '$wr_10' ";

	$tpageInsRst[$i] = sql_query($tpageSql);

	if(($tpageCnt - $i) == 1) {// 게시글 1 증가
		$tpageCntRst = sql_query(" updatee {$g5['board_table']} set bo_count_write = bo_count_write + 1 where bo_table = '{$tpage_table}' ");
	}

	// 이미지 업로드시(이미지는 하나만 업로드 됨)
	/*
	sql_query(" update `{$write['tpage_table']}` set wr_file = 1 where wr_id = '$wr_id' ");
	*/
}//end for

// 트랜젝션
if($twoblockInsert1 && $twoblockInsert2 && $twoblockInsert3 && $twoblockInsert4 && $tpageCntRst /** && $twoblockInsert5 **/) {
	for( $i=0; $i < count($materialInsRst); $i++ ){
		if ($materialInsRst[$i]) {
			$chkArrRst1 = true;
		} else {
			$chkArrRst1 = false;
		}
	}
	for( $i=0; $i < count($tpageInsRst); $i++ ){
		if ($tpageInsRst[$i]) {
			$chkArrRst2 = true;
		} else {
			$chkArrRst2 = false;
		}
	}
	if($chkArrRst1 && $chkArrRst2) {
		sql_query("COMMIT");
		$msg = "data success!!!";
	} else {
		sql_query("ROLLBACK");
		$msg = "data failure!!!";
		$statusCode = 443;
	}
} else {
	sql_query("ROLLBACK");
	$msg = "data failure!!!";
	$statusCode = 443;
}

이 질문에 댓글 쓰기 :

답변 2

테이블 타입을 innoDB로 바꿔서 해보세요

 

불량학생님도 도움 주셨는데,, 실수한 부분 쪽집게 처럼 알려주신 균이님 답변을 채택하고, 불량학생님은 좋아요를 대신 드립니다.
코드상 사소한 오류도 있었네요,. 관심가지고 답변 주신 두분께 감사드립니다.

올려주신 내용중에서 $materialCnt 이녀석의 값과 $materialArr[] 이녀석의 값은 어디서 오는것인지 이값이 있기는 한건지요???

네, 윗부분에 있는데, 코드가 잘렸습니다.
트랜젝션 부분 코드 빼고하면 모두 정상적으로 저장됩니다.
모든 테이블에 데이터가 들어가야 정보가 정상적으로 연동되는 것이라 트랜젝션 걸려고 한 것 입니다.

AUTOCOMMIT=0, BEGIN 둘다 다 해봤었는데 안되서 AUTOCOMMIT=0만 지정했었습니다.
구글링 해보니 AUTOCOMMIT=0과 BEGIN이 같은 뜻으로 해석하는 분들이 있어서, BEGIN을 뺀 것 입니다.
my.ini에서 설정하는게 없는건지.. 당췌 모르겠네요..

답변을 작성하시기 전에 로그인 해주세요.
전체 30
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT