データベース操作にPDO(PHPデータオブジェクト)を使用する場合、トランザクション処理は非常に重要な部分です。 PDO :: beginTransaction()を介して、データベーストランザクションを開始し、一連の操作を完了した後にコミットまたはロールバックを実行できるようにすることができます。ただし、 PDOは統一されたAPIを提供しますが、トランザクション実装メカニズムにはMySQLとPostgreSQLの間にいくつかのわずかな違いがあります。この記事では、これら2つのデータベースでのPDO :: BEGINTRANSACTIONの実装メカニズムと違いについて説明します。
広く使用されているリレーショナルデータベースとして、MySQLのトランザクション管理メカニズムはストレージエンジンのタイプに依存します。最も一般的なストレージエンジンはINNODBで、酸(原子、一貫性、分離、永続性)の特徴をサポートします。したがって、MySQLのトランザクション管理は、INNODBストレージエンジンの機能に大きく依存しています。
MySQLでは、 PDO :: beginTransaction()がトランザクションの開始をトリガーします。 MySQLは暗黙のトランザクションを使用します。つまり、InnoDBエンジンの下で、 BeginTransaction()が呼び出されると、データベースは新しいトランザクションを開始し、その後のすべてのSQL操作は、 Commit()またはRollBack()がトランザクションを終了するために明示的に呼び出されるまでこのトランザクションに含まれます。
トランザクションの開始: PDO :: BeginTransaction()を呼び出すと、MySQLは現在の接続をトランザクションモードとしてマークします。
SQL操作の実行:トランザクションが進行中である間、すべての挿入、更新、削除、その他の操作はすぐにデータベースに持続することはありませんが、メモリに保存され、提出を待っています。
コミットトランザクション: PDO :: Commit()を呼び出すと、すべての変更がデータベースに継続されます。
ロールバックトランザクション: pdo :: lollback()に電話すると、すべての変更が取り消されます。
自動コミットモード:MySQLでは、トランザクションが明示的に開始されない場合、データベースはデフォルトで自動コミットモードをオンにします。つまり、各SQLステートメントは自動的に送信されます。
トランザクション分離レベル:MySQLは、読み取りのない、 commited、繰り返し読み取り、シリアル化可能な読み取りなど、複数のトランザクション分離レベルをサポートします。これらの分離レベルは、 PDO構成を介して設定できます。
PostgreSQLは、優れたトランザクションサポートを備えた強力なオブジェクト関連データベースであり、酸の原理に厳密に準拠しています。 PostgreSQLでは、トランザクション管理はMySQLに類似しており、 PDO :: beginTransaction()もトランザクションを開始し、トランザクション内の後続の操作が含まれます。
MySQLと比較して、PostgreSQLのトランザクションメカニズムには、特に分離と一貫性の点で、いくつかのユニークな機能があります。
トランザクションの開始:mysqlと同様に、 pdo :: begintransaction()が呼び出された場合、postgreSQLはトランザクションを明示的に開始し、すべてのSQL操作がこのトランザクションに含まれます。
SQL操作の実行:すべてのSQLステートメントは、トランザクションがコミットされるまで、トランザクション内のデータベースをすぐに持続しません。
トランザクションの送信: PDO :: Commid()が呼び出されると、すべての変更はデータベースに永続的に保存されます。
ロールバックトランザクション: PDO :: Rollback()に電話して、トランザクション中のすべての変更が取り消されます。
厳密なトランザクション制御:PostgreSQLはMVCC(マルチバージョンの同時制御)を強調し、各トランザクションには独自のビューとデータの一貫性があるため、他の同時トランザクションの影響はありません。
自動提出:postgreSQLは、MySQLと同様に、デフォルトで自動提出を有効にします。トランザクションが明示的に有効になっていない場合、各SQLステートメントは独立したトランザクションとして扱われます。
トランザクション分離レベル:PostgreSQLのデフォルトのトランザクション分離レベルはコミットされますが、繰り返し読み取りやシリアル化などの構成によってより厳格な分離レベルを使用できます。
MySQLは、ロックメカニズムと一貫性読み取りを使用してトランザクションの分離を確保しますが、そのロック粒度と並行性制御はストレージエンジンにさらに依存しています。繰り返し可能な読み取りは、MySQLのデフォルトのトランザクション分離レベルであり、シリアル化分離レベルがオンになっていない限り、ファントムの読み取りに遭遇する可能性があります。
PostgreSQLはMVCCを使用してトランザクションの同時制御を実装するため、より孤立して幻想の読み取り現象を回避します。各トランザクションには独立したビューがあり、明示的にコミットされるまで他のトランザクションの影響を受けません。
MySQLがINNODBストレージエンジンを使用する場合、トランザクションコミットにはログライティングおよびロック操作が含まれるため、トランザクションコミットのパフォーマンスはある程度影響を受けます。頻繁にトランザクションコミット操作の場合、トランザクションサイズを最適化し、ポリシーをコミットする必要がある場合があります。
PostgreSQLのMVCCメカニズムにより、トランザクションがコミットするときに同時操作をより効率的に処理することができますが、トランザクションが長いときにより高いストレージオーバーヘッドをもたらす可能性があります。
MySQLでは、エラーが発生した場合、 PDO :: RollBack()はすべての操作を取り消し、関連するロックを解放します。
PostgreSQLでは、トランザクションが失敗すると、 PDO :: RollBack()はすべての操作を取り消し、データベースの一貫性を維持し、MVCCはデータベース状態がトランザクションの開始時に状態に復元されることを保証します。
MySQLは、自動提出が明示的に無効になっていない限り、デフォルトで自動送信を有効にします(たとえば、 PDO :: ATTR_AUTOCOMMITプロパティを設定することにより)。
PostgreSQLはデフォルトで自動コミットを有効にしますが、トランザクションが有効になった後、 Commit()またはRollback()が明示的に呼び出されるまで自動コミットが無効になります。
MySQLとPostgreSQLはどちらも酸の原理に従い、 PDO :: beginTransaction()を介して統一されたトランザクション制御インターフェイスを提供しますが、基礎となる実装にいくつかの違いがあります。 MySQLは、トランザクションを管理するためにストレージエンジン(INNODBなど)に依存していますが、PostgreSQLはMVCCメカニズムを介してより強力な並行性制御とトランザクションの分離を提供します。データベースを選択するとき、トランザクション処理の違いを理解することは、特定のアプリケーションシナリオのニーズに基づいて、より適切な決定を下すのに役立ちます。