2016-09-02 1 views
1

문제 : mysqli_begin_transaction와 MySQL을 저장 프로 시저와 데이터를 저장mysqli_commit는 선택 문이 추가 될 때 실패

수 없습니다.

세부 사항 :

아래의 코드는 간단한 insertselect 사용하여 MySQL의 저장 프로 시저를 할 것입니다. 코드는 이 아니고select 문없이 실행됩니다. 그러나 일단 select 문이 추가되면 쿼리가 PHP 측에서 성공을 반환하더라도 데이터를 커밋하지 않습니다.

니펫 (PHP)

$DB_DRRM_SQLI = mysqli_connect("localhost","root","", "sandbox_db"); 
mysqli_begin_transaction($DB_DRRM_SQLI); 

$SQL_QUERY_CODE = "CALL SANDBOX_TEST()"; 
$DB_QUERY = mysqli_query($DB_DRRM_SQLI, $SQL_QUERY_CODE); 


// ERROR REPORTING 
if($DB_QUERY === false) 
{ 
    echo mysqli_error($DB_DRRM_SQLI); 
    mysqli_rollback($DB_DRRM_SQLI); 
} 
else 
{ 
    echo 'success'; 
    mysqli_commit($DB_DRRM_SQLI); 
} 
exit; 

니펫 (MySQL의 저장 절차)

BEGIN 
    INSERT INTO 
    `sandbox_table` 
    (
     `SOME_STRING` 
    ) 
    VALUES 
    (
     'ABCDEFGHIJKL...' 
    ); 

    SELECT 
     LAST_INSERT_ID() AS INSERTED_ID, 
     'ABCDE...' AS OTHER_PARAMS; 
END 

데이터베이스 (표 sandbox_table)

  1. RECORD_PRIMARY_ID (지능 - 자동 증가)
  2. SOME_STRING (대 Varchar - 500 길이)

사양 :

  • PHP 버전 : 5.6.14
  • 10.1.8- MariaDB
  • 스토리지 엔진 : InnoDB

주 :

  • 트랜잭션이 저장 프로 시저에서 수행하는 경우 잘 작동하지만 내가 쿼리의 결과에 따라 여러 쿼리 요청 및 응답을 처리하는 PHP 관리 트랜잭션이 필요합니다.

      :

    방법은 테스트

  • 은 (내가 저장 프로 시저에 전체 PHP 코드를 변환해야합니다 및 매개 변수의 톤을 전달할 필요가 다른 솔루션이 존재하지 않는 경우는 가능한 최후의 수단이 될 수 있음)
  • 동일한 결과 (10.1.16-MariaDB)를 가진 다른 PHP 버전 7.0.9와의 비교
  • sandbox_table 이상의 저장 프로 시저를 제외한 다른 데이터가없는 새 데이터베이스로 테스트되었습니다.
  • 추가 포함 라이브러리없이 테스트 (위의 스 니펫에서만 테스트 됨).
+0

당신은 어떻게 mysqli가 실패 커밋 알 수 있습니까? –

+0

저장 프로 시저 자체에서 트랜잭션 처리를 수행하지 않는 이유는 무엇입니까? – Shadow

+0

@Your Common Sans 그것은'sandbox_table'에 어떤 레코드도 저장하지 않을 것입니다.이 샘플은'SOME_STRING' 필드에 "ABCDEFGHIJKL ..."문자열을 가진 단일 레코드를 추가해야합니다. – FrozenFire

답변

관련 문제