2013-08-14 2 views
2

으로 PHP :이 코드의내가 자동 커밋 해제하는 코드를 작성했습니다 자동 커밋

<?php 
$con = mysqli_connect("localhost","root","","databases"); 
if (mysqli_connect_errno($con)) 
{ 
echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 
if(mysqli_query($con,"SET autocommit=0")){//tried using mysqli_autocommit($con,FALSE); 

// Insert some values 
$a=mysqli_query($con,"INSERT INTO member VALUES (2,'Peter','Peter')"); 
$b=mysqli_query($con,"INSERT INTO member VALUES (3,honey,'honey')"); 
echo "a:"; 
echo $a; 
echo "b:"; 
echo $b; 
if($a&&$b){ 
mysqli_query($con,"COMMIT");//tried using mysqli_commit($con); 
echo "in if"; 
} 
else{ 
mysqli_query($con,"ROLLBACK");//tried using mysqli_rollback($con); 
echo "in else"; 
} 
} 
mysqli_close($con); 
?> 

출력은 다음과 같습니다 A : 1 B : 테이블 다른

에서 그러나에 , 행을 첫 번째 행을 삽입하는 중입니다. 나는 이것을 위해 wamp를 사용했다. 내가 잘못 트랜잭션이 시작 내가이 기능을 사용하고

+0

같은 삽입 쿼리를 교체하십시오 당신이 먼저'작은 따옴표 ''honey'' – cmorrissey

답변

0

을 하겠어 어디 알려 주시기 바랍니다, 커밋 및 롤백 :

function transactionStart($dbConnection){ 
    return $dbConnection->autocommit(false); 
} 
function transactionCommit($dbConnection) { 
    $dbConnection->commit(); 
    return $dbConnection->autocommit(true); 
} 
function transactionRollback($dbConnection) { 
    $dbConnection->rollback(); 
    return $dbConnection->autocommit(true); 
} 

특정 사건에 대한 pseude 코드의 조금 :

//TODO: Build up connection, results in $con variable 
transactionStart($con); 
//TODO: Insert data 
if(*all data inserted correctly*){ 
    transactionCommit($con); 
} else{ 
    transactionRollback($con); 
} 
0

트랜잭션을 구성하는 일련의 sql 명령을 실행하기 전에 트랜잭션을 시작해야합니다.

START TRANSACTION 

은 SQL로 처리합니다. 또는이 작업을 깔끔하게 수행하려면

$con->autocommit (false); 
$con->begin_transaction(); 
... transactional SQL statements ... 
$con->commit(); 

을 사용할 수 있습니다.

PHP + MySQL transactions examples

@Sylvain 레녹스는 권리입니다! MyISAM을 사용하고 있다면, 원하는 모든 트랜잭션 명령을 내릴 수 있으며 여전히 작동하지 않을 것입니다. 트랜잭션 지원은 InnoDB에있다.

+1

보완, 당신은 물론 트랜잭션 테이블을 사용합니다 필요 honey' (예 : 이노) –

+0

나는이 답변에 돌아왔다 : 나는 의심의 여지가있다. auto_commit이 false로 설정되면 트랜잭션을 명시 적으로 시작할 필요가 없습니다. [doc] (http://dev.mysql.com/doc/refman/5.0/en/commit.html)을 인용하려면 다음을 수행하십시오. "일련의 명령문에 대해 자동 커밋 모드를 암시 적으로 사용하지 않으려면 START TRANSACTION 문을 사용하십시오." "START TRANSACTION"을 사용하여 auto_commit을 전역 적으로 * 또는 * temporary로 비활성화해야합니다. 아니? –

0

두 번째 열이 varchar이라고 생각합니다. 두 번째 삽입 문은 에 두 번째 열에 대해 따옴표가 누락되었습니다.

$a = mysqli_query($con,"INSERT INTO member VALUES (2,'Peter','Peter')"); 
$b = mysqli_query($con,"INSERT INTO member VALUES (3,'honey','honey')");