データベース操作では、トランザクション管理は非常に重要な概念であり、データ操作の原子性、一貫性、分離、および持続性(つまり、酸特性)を保証します。 PHPでは、PDO(PHPデータオブジェクト)を使用してデータベースと対話することができますが、PDOが提供するbeginTransaction() 、 commive() 、およびrollback()メソッドを介してトランザクション管理を実装できます。この記事では、PDOのBEGINTRANSACTIONとロールバックを組み合わせて使用する方法を詳細に紹介し、トランザクションロールバック操作を実装します。
トランザクションとは、成功または失敗する一連の操作のコレクションを指します。トランザクションは、データベース操作の一貫性と整合性を確保します。データベースシステムでは、トランザクションの基本的な特性は酸によって説明できます。
Atomity :トランザクションのすべての操作は完了するか、完了しません。
一貫性:トランザクションの実行により、データベースは一貫した状態から別の状態に移行します。
分離:複数のトランザクションが同時に実行された場合、1つのトランザクションの実行を他のトランザクションによって干渉しないでください。
耐久性:トランザクションがコミットされると、データベースの変更は永久に保存されます。
PDOでは、トランザクションの基本操作には次のものがあります。
begintransaction() :トランザクションを開始します。
commit() :取引トランザクション。
Rollback() :ロールバックトランザクション。
一般に、データベース操作中に、ステップエラーが発生した場合、 Rollback()メソッドを使用してトランザクションをロールバックし、以前のすべての操作を取り消すことができます。
レコードの挿入、レコードの更新など、複数のデータベース操作を実行する必要があるとします。操作のいずれかが失敗した場合は、データベースの一貫性を確保するために以前のすべての操作を元に戻すことができます。この時点で、 begintransaction()およびrollback()メソッドを使用できます。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-comment">// 作成するPDO接続する</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=testdb'</span></span><span>, </span><span><span class="hljs-string">'username'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>);
</span><span><span class="hljs-comment">// エラーモードを例外に設定します</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">setAttribute</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">ATTR_ERRMODE</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">ERRMODE_EXCEPTION</span></span><span>);
</span><span><span class="hljs-comment">// トランザクションを開始します</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">beginTransaction</span></span><span>();
</span><span><span class="hljs-comment">// 最初のものを実行しますSQL動作します</span></span><span>
</span><span><span class="hljs-variable">$sql1</span></span><span> = </span><span><span class="hljs-string">"INSERT INTO users (username, email) VALUES ('john_doe', '[email protected]')"</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-variable">$sql1</span></span><span>);
</span><span><span class="hljs-comment">// 2番目を実行しますSQL動作します</span></span><span>
</span><span><span class="hljs-variable">$sql2</span></span><span> = </span><span><span class="hljs-string">"UPDATE accounts SET balance = balance - 100 WHERE username = 'john_doe'"</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-variable">$sql2</span></span><span>);
</span><span><span class="hljs-comment">// すべてが問題ない場合,トランザクションを送信します</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">commit</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"トランザクションの提出が成功しました!"</span></span><span>;
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-comment">// エラーが発生した場合,ロールバックトランザクション</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">rollBack</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"トランザクションロールバック:"</span></span><span>, </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>PDO接続を確立する:まず、PDOを介してMySQLデータベースに接続し、エラーモードをPDO :: errmode_exceptionに設定して、エラーが発生したときに例外がスローされるようにします。
トランザクションの開始: $ pdo-> begintransaction()を呼び出すことにより、トランザクションを開始するようにPDOに指示します。現時点では、すべてのデータベース操作はトランザクション管理下にあります。操作が失敗した場合、他の操作は提出されません。
SQL操作を実行します:
最初のSQL操作は、ユーザーレコードを挿入することです。
2番目のSQL操作は、ユーザーアカウントの残高を更新することです。
コミットトランザクション:すべての操作が成功した場合、 $ pdo-> commit()を呼び出して、すべての操作をデータベースに永続的に保存してトランザクションを送信します。
ロールバックトランザクション:実行中に例外が発生した場合(2番目のSQL操作が失敗するなど)、 CATCHブロックのコードがトリガーされ、 $ PDO-> lollback()がトランザクションロールバックの場合、すべてのコミットされていない操作がキャンセルされます。
トランザクションの原子性: begintransaction()を使用した後、すべてのデータベース操作は全体として扱われます。エラーが発生した場合、ロールバック()は、データの一貫性を確保するためにトランザクション全体を取り消すことができます。
例外処理:トライキャッチブロックを使用して例外をキャッチして、操作が失敗したときにトランザクションを時間内にロールバックできることを確認してください。
複数のトランザクション操作:トランザクションで複数の操作を実行する場合、トランザクションがコミットされる前にエラーが発生しない限り、すべての操作が有効になります。
PDOのBeginTransaction()およびRollBack()メソッドを使用すると、データベース操作の原子性と一貫性を確保するためにエラーが発生したときにPHPのトランザクションを効率的に管理し、トランザクションロールバック操作を実行できます。この方法は、特にファンド取引や注文処理などの機密操作を処理する場合、複数のデータベース操作が必要なシナリオで非常に便利です。トランザクションロールバックは、データの矛盾を回避できます。
関連タグ:
PDO