2012-02-16 1 views
0

可能性の重複:
MySQL AUTO_INCREMENT does not ROLLBACKなぜPHP関数がmysql_insert_idをロールバックした後でも自動的にインクリメントするのですか?

<?php 
header("Content-Type:text/html; charset=utf-8") ; 

$conn = mysql_connect('127.0.0.1', 'root', '123456') ; 

mysql_select_db('test') ; 

mysql_query('set autocommit=0') ; 
mysql_query('start transaction') ; 

try 
{ 
    $sql = "insert into `user`(`username`, `password`) values('demo', 'demopassword')" ; 
    echo $sql, '<br/>' ; 
    $rs = mysql_query($sql) ; 
    echo mysql_affected_rows(), '<br/>' ; 
    if (mysql_affected_rows() > 0) 
    { 
     $uid = mysql_insert_id() ; 
     echo $uid, '<br/>' ; 
     throw new Exception('conn exception : ' . mysql_error()) ; 
    } 
    else 
    { 
     throw new Exception('conn exception : ' . mysql_error()) ; 
    } 
} 
catch(Exception $e) 
{ 
    echo $e->getMessage(), '<br/>' ; 
    echo "rollback", "<br/>" ; 
    mysql_query('rollback') or die(mysql_error()) ; 
} 

if (!$conn) 
{ 
    mysql_close($conn) ; 
} 
?> 

申し訳ありません...私の英語はとても悪い...

は、コードの上に見... 私は新鮮そのページ... uid変数が自動的に増分されます。 なぜですか?

私はuが私を理解してほしい... くださいhelp..thanks

答えて

1

なぜこれが問題でしょうか? MySQLは挿入を試みるために自動インクリメント値を生成しなければならないので、トランザクションが(キー生成後に)失敗しても、そのキーは依然として有効に使用されます。あなたが正しく覚えている場合は、これらの使用されたキーを再利用するために、テーブルをクリーンアップすることができます。

関連する問題