롤백할 수 없는 PHP 트랜잭션에 대한 해결 방법: 1. 해당 PHP 파일을 엽니다. 2. "function update_user_set_date_of_birth($date_of_birth){...}" 코드를 확인합니다. 3. "$this->mysqli-를 전달합니다. > Autocommit(false);"를 사용하여 자동 제출을 끌 수 있습니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, PHP 버전 8.1, Dell G3 컴퓨터.
PHP 트랜잭션을 롤백할 수 없으면 어떻게 해야 하나요?
문제 설명:
롤백을 수행하지 않는 PHP 트랜잭션에 대해
mysqliphptransactions Transactions not doing the rollback
사용자를 업데이트하는 기능이 있습니다:
function update_user_set_common($date_of_birth, $mobile, $street, $housenumber, $addition, $postal_code, $location, $country) { try { $this->mysqli->begin_transaction(); $this->update_user_set_date_of_birth($date_of_birth); $this->update_user_set_mobile($mobile); $this->update_user_set_address($street, $housenumber, $addition, $postal_code, $location, $country); $this->mysqli->commit(); return true; } catch (Exception $e) { $this->mysqli->rollback(); echo"Error:" . $e; return false; } }
보시다시피 트랜잭션을 만들었습니다. 모든 것이 정상이면 커밋해야 하고, 오류가 발생하면 롤백해야 합니다.
다음은 내 업데이트 쿼리가 작동하는 방식에 대한 예입니다.
function update_user_set_date_of_birth($date_of_birth) { return $this->update_user_set_singlefield(COL_USER_DATE_OF_BIRTH, $date_of_birth); } function update_user_set_singlefield($field, $value) { if ($update_stmt = $this->mysqli->prepare("UPDATE" . TABLE_USER ." SET" . $field ." = ? WHERE" . COL_USER_ID ." = ?")) : if (!$update_stmt->bind_param("ss", $value, $this->USER_ID)) : $update_stmt->close(); return false; endif; if (!$update_stmt->execute()) : $update_stmt->close(); return false; else : $update_stmt->close(); return true; endif; else : return false; endif; }
이제 예를 들어 update_user_set_mobile이 실패하지만 롤백이 없습니다. update_user_set_date_of_birth 이전의 명령문은 계속 실행되며 원래 명령문으로 다시 변경되지 않습니다.
왜 롤백이 없나요?
innodb를 사용하여 보여주기 위한 테이블 생성 예:
CREATE TABLE `USER` ( `USER_ID` bigint(20) NOT NULL PRIMARY KEY AUTO_INCREMENT, `USER_E_MAIL` varchar(255) COLLATE utf8_bin NOT NULL, `USER_PASSWORT` varchar(255) COLLATE utf8_bin NOT NULL, `USER_PASSWORT_SALT` varchar(255) COLLATE utf8_bin NOT NULL, `USER_FIRSTNAME` varchar(255) COLLATE utf8_bin NOT NULL, `USER_LASTNAME` varchar(255) COLLATE utf8_bin NOT NULL, `USER_DATE_OF_BIRTH` varchar(200) COLLATE utf8_bin DEFAULT NULL, `USER_MOBILE` varchar(255) COLLATE utf8_bin DEFAULT NULL, `ADDRESS_ID` bigint(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
문제 해결:
mysqli 대신 자동 커밋 끄기-> .autocommit.php
추천 학습: "
PHP 비디오 튜토리얼위 내용은 PHP 트랜잭션을 롤백할 수 없으면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!