2011-03-20 4 views
7

준비된 문과의 트랜잭션을 수행 할 수있는 방법이 있습니까? 거래와 http://php.net/manual/en/mysqli.prepare.php : 내 말은MySQLi 준비된 문 및 트랜잭션

나는 $mysqli->autocommit(FALSE);$mysqli->commit();$mysqli->rollback();

//Preparing the statment 

$insert_stmt=$mysqli->prepare("INSERT INTO x VALUES(?,?)") 
or die($mysqli->error); 

//associate variables with the input parameters 

$insert_stmt->bind_param("is", $my_number,$my_string); //i=integer 

//Execute the statement multiple times.... 

for ($my_number = 1; $my_number <= 10; $my_number++) 
{ 
    $my_string="row ".$my_number; 
    $insert_stmt->execute() or die ($insert_stmt->error); 
} 
$insert_stmt->close(); 

나는 주위를 둘러 보았다 한 다음과 같은 예를 사용할 수 있지만 준비된 문 (안 PDO)를 사용의 예를 찾을 수 없습니다 나는 여기에 언급 된 예제들만 찾아 보았습니다 : http://book.opensourceproject.org.cn/lamp/mysql/mysqlstored/opensource/0596100892/mysqlspp-chp-13-sect-2.html 트랜잭션과 prepared statement는 절대 혼재하지 않습니다.

함께 사용하는 것이 좋지 않습니까?

답변

7

준비 문과 트랜잭션은 관련없는 기술 및 기술입니다.

전용 방법을 사용하는 대신 START TRANSACTIONCOMMIT/ROLLBACK 명령을 직접 발급 할 수 있습니다. 기능적으로 동일합니다.

루프를 들어

, 당신은 START TRANSACTION 전에 prepare, 다음 COMMIT 후 루프가 종료를 발행 할 것입니다. 준비된 명령문이 시작되었지만 실행되기 전에 트랜잭션을 열지 마십시오.

자동 트랜잭션을 사용하지 않기 위해 "트랜잭션 시작"명령을 추가하지 않았습니다. mysqli에 관한 이상한 것들 중 하나인데, 항상 저 대신 PDO를 권유합니다. :) 트랜잭션을 열면 암시 적으로 트랜잭션 기간 동안 자동 커밋이 꺼집니다.

+0

고맙습니다. :) 루프가 끝난 후 오류를 확인하고 오류가 발생하면 롤백해야하지 않습니다. (오류가없는 경우 커밋합니다) – Yerel

+0

mysqli보다 PDO의 다른 큰 장점 중 하나입니다. 예외를 던지므로 오류 코드를 계속해서 확인하지 않아도되므로 롤백 또는 커밋에 대한 결정을 크게 단순화 할 수 있습니다. – Charles

+2

OMG,이게 너무 많은 도움이됩니다. 나는 INSERT 명령으로 ~ 5000 개의 행을 작성한 스크립트를 작성했다. 완료하는 데 몇 시간이 걸렸다. '$ mysqli-> autocommit (FALSE);와'$ mysqli-> commit(); '을 추가하면 몇 분 안에 동작하게됩니다! :-) –

관련 문제