1
문제 : mysqli_begin_transaction
와 MySQL을 저장 프로 시저와 데이터를 저장mysqli_commit는 선택 문이 추가 될 때 실패
수 없습니다.
세부 사항 :
아래의 코드는 간단한 insert
및 select
사용하여 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)
- RECORD_PRIMARY_ID (지능 - 자동 증가)
- 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
이상의 저장 프로 시저를 제외한 다른 데이터가없는 새 데이터베이스로 테스트되었습니다.- 추가 포함 라이브러리없이 테스트 (위의 스 니펫에서만 테스트 됨).
당신은 어떻게 mysqli가 실패 커밋 알 수 있습니까? –
저장 프로 시저 자체에서 트랜잭션 처리를 수행하지 않는 이유는 무엇입니까? – Shadow
@Your Common Sans 그것은'sandbox_table'에 어떤 레코드도 저장하지 않을 것입니다.이 샘플은'SOME_STRING' 필드에 "ABCDEFGHIJKL ..."문자열을 가진 단일 레코드를 추가해야합니다. – FrozenFire