2016-07-15 14 views
1

は、私のコードの構造です:PDOトランザクションAPIはどのように機能しますか?ここ

// db connection here 

try { 
    $dbh_conn->beginTransaction(); 

    $stm = $dbh_conn->prepare("SELECT user_id FROM resend_pass WHERE token = ?"); 
    $stm->execute(array('value')); 
    $num_rows = $stm->fetch(PDO::FETCH_ASSOC); 

    if($num_rows) { 
     echo 'one'; die; 

    } else { 
     echo 'two'; die; 

    } 

    $dbh_conn->commit(); 

} catch(PDOException $e) { 
    $dbh_conn->rollBack(); 

    echo 'three'; die; 

} 

まさにそのクエリを実行すると?ご存知のとおり、私のスクリプトは期待どおりに動作します。しかし、私はどのように思っていますか?あなたが見る通り、commite()の前にif - elseの文があります。また、ifおよびelseの両方は、そのブロックにdie;を有する。だから、私の知る限りでは、この行は実行されません:

$dbh_conn->commit(); 

dieその前に無愛想ありますので。しかし、意外にも私のコードはうまくいきます。ここでは、すべての可能な出力は次のようになります。

  • valueresend_passテーブルにトークンとして存在する場合、それはoneを印刷します。
  • resend_passテーブルにvalueがトークンとして存在しない場合はtwoを出力します。
  • エラー(構文SQLエラーなど)

を参照してくださいがある場合はthreeを出力しますか?大丈夫だ。しかしどうですか?正確にcommit()関数が実行されるとき?それらの前にdie

resend_passのエンジンは、INNODBあります。

+0

phpが終了するとクリーンアップされます。つまり、データベースから切断されます。 mysqlはそれを見て、ロールバックを発行して、接続が "ゴミ"になるようにします。 'die'はスクリプトを直ちに殺します。シャットダウン機能を登録しない限り、あなたのコミットコールは決して実行の機会を得ることはありません。 –

+0

@MarcB * "あなたのコミットコールは決して実行する機会がありません" * - 間違っています。私が言ったように、そのクエリが実行され、 'if($ num_rows){'はそのクエリの結果に基づいて実行されます。 –

+0

何が問題なのですか? PHPは時間旅行しません。単にスクリプトの「将来」のどこかに「死ぬ」コマンドがあるからといって、PHPがスクリプトをまったく実行しないことを意味するわけではありません。それは、コードを正確に実行しながら、コードを1行ずつ実行します。それはあなたのクエリを実行します。結果をフェッチします。その結果をテストし、それが「死ぬ」かもしれません。 –

答えて

1

​​が呼び出されたときにクエリが実行されます(query()は​​です)。

トランザクションがサポートされているテーブルでクエリがデータを変更した場合、オブジェクトが有効範囲外になったりスクリプトが終了してクリーンアップしたりするため、PDOオブジェクトが解放された場合、変更がロールバックされます。これは、MySQLではなく、PDOコードによるものです。

クエリがトランザクションをサポートしていないテーブル(MyISAMテーブルなど)のデータを変更した場合、その変更は実行時に永続的であり、ロールバックできません。

SQL statements that perform an implicit commitがあります。 commit()を呼び出す前にあなたのスクリプトが死んでも、それらは実行されるとすぐに恒久化されます。

@MarcBは、読者専用のSELECTステートメントを示しています。 INSERT/UPDATE/DELETEを使用すると、動作をテストする方が簡単です。

+0

私の現在の構造はいいですか? –

+0

はい、問題ありません。スクリプトが 'die()'を呼び出すと、トランザクションはロールバックされます。 –

+0

私はかなり似たような質問をしました。あなたはいくつかの自由時間があるかどうか見てみてくださいhttp://stackoverflow.com/questions/38579529/how-my-script-rollbacks-the-queries-before-executing-rollback-function – stack

関連する問題