트랜젝션 오류
본문
코드가 좀 길긴 하나, 트랜젝션이 정상적으로 이루어지지 않고,, 마지막 페이지 데이터 입력만 정상적으로 처리 됩니다.
코드가 잘못된 것인지, 아니면, 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로 바꿔서 해보세요