PHP PDO総務自動コミット
今接続PDOは、クエリの開始前で行ってきましたを介し、最初にPDOが業務を管理する方法を理解する必要があります。
トランザクションサポートの4つのプロパティ(ACID):
- アトミック(不可分)
- 一貫性(整合性)
- 絶縁(アイソレーション)
- 永続(耐久性)
もっと単純に、すべての操作は、トランザクション内であっても段階的な実施を行って、だけでなく、セキュリティを保証するために、データベースに適用され、他の接続からの時間干渉に提出されることはありません。
トランザクション操作も自動的にそれが簡単にスクリプト内のエラーを処理することができている、(まだ提出していないと仮定して)要求に応じて取り消すことができます。
取引は通常変更「貯金」アップしてから発効させ、実装の数で行われます。そうすることの利点大幅に変更することができ、これらの効率を提供することにあります。
つまり、トランザクションはスクリプトが速く、潜在的により堅牢にすることができます(あなたはまだ、その利益を享受するために、それらを正しく使用する必要があります)。
残念ながら、すべてのデータベースは、トランザクションをサポートしていますので、あなたが最初の接続を開くときに、PDOは、いわゆる「自動コミット」動作モードを必要とします。
自動コミットモードは、データベースがありません、トランザクションをサポートしていない場合は、データベースのサポート場合は、各クエリの実行は、独自の暗黙的なトランザクションを有することを意味します。
あなたは、トランザクションが必要な場合は、起動するためにPDO ::のbeginTransaction()メソッドを使用する必要があります。 基礎となるドライバがトランザクションをサポートしていない場合、例外PDOExceptionをスローして(関係なく、エラー処理設定のどのような種類の、これは重大なエラー状態です)。
トランザクションが利用可能PDOたら::コミット()やPDO ::ロールバック()トランザクションコードに応じて、完了するために正常に実行されています。
注意:PDOのみかどうかドライバ層の検査でのトランザクション処理能力。 いくつかの実行時の条件は、トランザクションが利用できないことを意味し、データベース・サービスがトランザクションを開始する要求を受け入れた場合、PDO ::のbeginTransaction()はまだTRUEとエラーなしを返します。 トランザクションを使用してみてくださいすると、MySQLデータベースのMyISAMテーブルでは良い例です。
スクリプトが終了したか、接続がクローズされようとしているときに完了したトランザクションがない場合、PDOは自動的にトランザクションをロールバックします。 このセキュリティ対策は、スクリプト内の不整合を回避するのに役立つ予期せずに終了 - 明示的にトランザクションをコミットしていない場合は、仮定はどこか間違っているので、ロールバックは、データのセキュリティを確保するために行われます。
注意:以降でのみ、それは自動的にロールバック発生する可能性があります:: PDOトランザクションを開始するのbeginTransaction()。 手動でトランザクションを開始するクエリを発行する場合は、必要に応じてロールバックすることができない、ように、PDOは、知ることができません。
トランザクションでバッチを実行します:
次の例では、23はIDを割り当て、新しい従業員のためのエントリのセットを作成するとします。 登録者の基本データに加えて、だけでなく、あなたは彼の給料を記録する必要があります。
両方の更新が、それは非常にシンプルですが、PDO ::のbeginTransaction()およびPDO ::コミット()の呼び出しを閉じることによって完成されている、それが変化する前に、他の人がこれらの変更を見ることができない確保することが可能です。
エラーは、catchブロックを発生した場合、トランザクション以降のすべての変更は、最初からロールバックされ、エラーメッセージが出力されました。
<?php try { $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', array(PDO::ATTR_PERSISTENT => true)); echo "Connected\n"; } catch (Exception $e) { die("Unable to connect: " . $e->getMessage()); } try { $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh->beginTransaction(); $dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')"); $dbh->exec("insert into salarychange (id, amount, changedate) values (23, 50000, NOW())"); $dbh->commit(); } catch (Exception $e) { $dbh->rollBack(); echo "Failed: " . $e->getMessage(); } ?>
トランザクションの変化に限定されるものではなく、それがデータを抽出するために複雑なクエリを発行することができるだけでなく、その情報を使用して、より変更し、クエリを構築するために、トランザクションがアクティブなとき、あなたは他の人が進行中の操作に変更を加えることができないことを保証することができます。