2013-07-26 2 views
0

트랜잭션을 수행하기 위해 이전 스타일의 mysql_query() 함수를 사용하고 있습니다. 트랜잭션의 쿼리 중 하나가 실패하더라도 롤백되지 않습니다. 영향을받는 행을 디버깅했으며 0 또는 1입니다. 구문 뒤에 :PHP + MySQL - 트랜잭션이 롤백되지 않습니다.

$cnx = mysql_connect(..); 
mysql_select_db("DB", $cnx); 
mysql_query("START TRANSACTION"); 
mysql_query("BEGIN"); 

$isrollback = -1; 

for (...) // run through query list 
{ 
    mysql_query(".... query_i ...."); 
    if(mysql_affected_rows() == 0) 
    { 
      $isrollback = 1 
    } 

} 

// more queries 
if ($isrollback > 0) 
    mysql_query("ROLLBACK"); 
else 
    mysql_query("COMMIT); 
+2

어떤 DB 엔진을 사용하고 있습니까? MyISAM이 트랜잭션을 지원하지 않는다면 – Anigel

+2

mysql_affected_rows' => 성공시 영향을받는 행의 수를 반환하고 마지막 쿼리가 실패하면 -1을 반환합니다. – bitWorking

+1

트랜잭션을 두 번 시작할 필요가 없습니다.) –

답변

1

트랜잭션 데이터베이스 엔진을 사용해야합니다. 예 : INNODB

현재 거래를 지원하지 않는 MyISAM을 사용하고 있습니다.

즉, DB 엔진을 변경하지 않고 트랜잭션을 시작하거나 롤백 할 수 없습니다.

MySQL은을 변환하는 방법에 대한 지침을 제공합니다 MyISAM to INNODB

관련 문제