PHP 데이터베이스 작업에서 MySQLI Extension은 MySQL 데이터베이스를 연결하고 작동하는 데 가장 일반적으로 사용되는 방법입니다. 많은 시나리오에서는 거래를 사용하여 데이터베이스 작업의 원자력을 보장합니다. 그러나 때로는 오류 진단에 mysqli :: $ errno를 사용할 때 혼란스러운 상황에 직면 할 수 있습니다. 트랜잭션이 실패하더라도 mysqli :: $ errno는 0을 반환하여 문제를 진단하기가 어렵습니다.
먼저, 우리는 mysqli :: $ errno 의 작동 방식을 이해해야합니다. mysqli :: $ errno는 마지막 데이터베이스 작업의 오류 코드를 반환합니다. 작업이 성공하면 그 값은 0입니다. 작업이 실패하면 0이 아닌 오류 코드를 반환합니다. 그러나 문제는 일부 데이터베이스 작업 (특히 트랜잭션 관련 데이터베이스 작업)이 항상 MySQLI :: $ errno를 직접 업데이트하지는 않으며 작업이 실패하더라도 중요한 오류 코드를 생성하지 않을 수 있다는 것입니다.
트랜잭션을 사용하여 문제가 발생하고 트랜잭션이 실패하더라도 MySQLI :: $ errno 가 여전히 0이라는 것을 알게되면 오류가 발생하지 않았다는 의미는 아닙니다. 실제로 트랜잭션 작업 자체는 오류 코드를 직접 보내지 않을 수 있습니다. 예를 들어, mysqli :: begin_transaction () 또는 mysqli :: commit ()를 사용할 때 데이터베이스 자체가 심각한 오류를 감지하지 않으면 오류 코드를 반환하지 않지만 트랜잭션을 "실패"로 표시 할 수 있습니다.
이 현상은 일반적으로 다음과 같은 상황에서 발생합니다.
자동 커밋 모드 : MySQLI :: $ auto_commit 이 트랜잭션에서 TRUE 로 설정된 경우 트랜잭션 작업이 자동으로 커밋 될 수 있으며 오류가 발생한 경우에도 명시적인 롤백이 없습니다.
SQL 오류는 나타나지 않습니다. 특히 데이터베이스 오류가 억제 될 때 일부 오류 (예 : 데이터 제약 오류)가 MySQLI :: $ errno 에 즉시 반영되지 않을 수 있습니다.
mysqli :: $ errno가 0을 반환하고 트랜잭션 작업이 실패한 것으로 의심되면 다음 기능을 결합하여 문제를 진단 할 수 있습니다.
mysqli :: $ 오류 :
mysqli :: $ 오류 데이터베이스 작업에 대한 오류 메시지를 반환합니다. mysqli :: $ errno 가 0이면 mysqli :: $ 오류를 확인하면 자세한 오류 정보를 얻는 데 도움이 될 수 있습니다. 명시적인 오류 코드가 없어도 데이터베이스 오류 메시지는 여전히 문자열로 존재할 수 있습니다.
if ($mysqli->errno) {
echo "Error: " . $mysqli->error;
}
mysqli :: error_list :
MySQL 버전 5.5+의 경우 MySQLI :: Error_List는 여러 오류 원인을 포함하여보다 자세한 오류 정보를 얻을 수있는 오류 목록을 제공합니다. 이는 트랜잭션이 복잡 할 때 특히 유용합니다.
$errors = $mysqli->error_list;
foreach ($errors as $error) {
echo "Error code: " . $error['errno'] . " - " . $error['error'];
}
mysqli :: rollback () :
트랜잭션 실패 문제가 발생하면 트랜잭션이 실패하면 롤백 ()을 명시 적으로 호출하고 오류 정보와 함께 트랜잭션을 롤백하여 문제를 분석 할 수 있습니다. 이는 불완전한 트랜잭션 커밋으로 인한 데이터 불일치를 피할 수 있습니다.
$mysqli->rollback();
echo "Transaction failed, rolled back.";
엔진 표시 상태 표시 :
MySQL의 내장 명령으로 InnoDB 엔진의 상태 정보를 얻습니다. 이 명령을 쿼리하면 교착 상태, 잠금 대기 및 기타 문제를 포함하여 거래와 관련된 자세한 정보를 볼 수 있습니다. mysqli :: query () 를 통해이 명령을 실행하여 더 많은 단서를 얻을 수 있습니다.
$result = $mysqli->query("SHOW ENGINE INNODB STATUS");
$status = $result->fetch_assoc();
echo $status['Status'];
데이터베이스 로그보기 :
경우에 따라 데이터베이스의 오류 로그가 더 유용한 정보를 제공 할 수 있습니다. 특히 일부 기본 트랜잭션 오류가 PHP가 반환 한 오류 코드를 통해 얻을 수없는 경우. MySQL 오류 로그 파일을 확인하거나 phpmyadmin과 같은 도구를 사용하여 이러한 로그를 볼 수 있습니다.
mysqli :: $ errno를 사용하는 경우, 트랜잭션 실패이지만 0은 자동 커밋 모드, SQL 오류 실패 등을 포함한 다양한 이유로 인한 것일 수 있습니다. 트랜잭션 실패 문제를보다 정확하게 진단하기 위해서는 MySQLI :: $ 오류 와 같은 다른 기능 및 메소드를 결합하여 MySQLI :: error_list , Engine InnoDB 상태를 표시 할 수 있습니다. 데이터 일관성을 보장하기 위해 트랜잭션 시작, 커밋 및 롤백 작업을주의해서 처리하십시오.