ホームページ  >  記事  >  バックエンド開発  >  PHP システムの宣言型トランザクション処理

PHP システムの宣言型トランザクション処理

WBOY
WBOYオリジナル
2016-06-23 13:19:37936ブラウズ

1. データベース トランザクション

トランザクションは同時実行制御の基本単位です。いわゆるトランザクションは一連の操作であり、これらの操作はすべて実行されるか、またはまったく実行されないかのいずれかになります。たとえば、銀行振込は、ある口座から引き落として別の口座にお金を追加するという動作で、両方の操作が実行されるか、どちらの操作も実行されません。したがって、これらは 1 つのトランザクションとして扱う必要があります。トランザクションは、データベースがデータの整合性を維持するための単位です。各トランザクションの終了時にデータの整合性が維持されます。トランザクションには次の 4 つの基本特性があります。 ● アトミック: トランザクションに含まれる操作は論理ユニットとみなされ、この論理ユニット内の操作はすべて成功するかすべて失敗します。 ● 一貫性: 有効なデータのみをデータベースに書き込むことができます。それ以外の場合は、トランザクションを元の状態にロールバックする必要があります。 ● 分離: トランザクションにより、データの正確性と整合性を損なうことなく、複数のユーザーが同じデータに同時にアクセスできます。同時に、並列トランザクションによる変更は、他の並列トランザクションによる変更から独立している必要があります。 ● 持続性: トランザクション終了後、トランザクションの結果が確定する必要があります。

2. データベース トランザクション管理を実装する方法

2.1 コード化されたトランザクション

コード内で beginTransaction()、commit()、rollback() およびその他のトランザクション管理関連メソッドを明示的に呼び出すことは、コード化されたトランザクション管理です。コード化されたトランザクション管理では、プログラマが特定のビジネス コードでトランザクション管理関連のメソッドを明示的に呼び出し、さまざまな条件に基づいてコミットするかロールバックするかを明示的に決定する必要があります。この方法は、業務が単純なシステムでは使用できますが、業務が複雑なシステムの場合、特に業務要件の変更が非常に頻繁なシステムでは、特定の条件の判断ができないため、誤った送信やロールバックが発生する可能性があります。判断条件が欠如しているため、業務調整に基づいて適時に変更すると、誤った送信やロールバックが発生する可能性があります。コード化トランザクションはビジネスロジックコードと連携したトランザクション管理が必要であり、タイムリーなロールバック条件の判断や更新が難しく、予期せぬトランザクションの入れ子が発生する場合があるため、コード化トランザクションを使用したトランザクション管理は推奨されません。

2.2 宣言型トランザクション

TP システムの宣言型トランザクション管理メカニズムは、最下位レベルの TP フレームワークの動作拡張メカニズムに基づいています。その本質は、コントローラーのターゲット メソッドが実行される前にトランザクションを開始し、コントローラーのターゲット メソッドが実行された後、実際の状況に応じてトランザクションがコミットまたはロールバックされることです。

宣言型トランザクションの最大の利点は、特定のビジネス ロジック コードにトランザクション管理コードを混在させる必要がなく、モジュール構成でトランザクション管理を有効にする必要があるメソッドを宣言するだけで、トランザクションを適用できることです。ビジネスロジックに。

3. TP プロジェクトの宣言型トランザクション処理メカニズムの実装

1) システム定数設定に 2 つの定数を追加します:
// 开启数据库事务define('DB_TRANS_ENABLE', true);// 数据库事务全局标志define('DB_TRANS_VAR', 'tx_comment');
2) BaseModel Save の TP フレームワークの Model クラスで、add、addAll、delete、execute をオーバーロードします。メソッド

詳細については、関連するコードを参照してください。

3) MyActionBeginBehavior の run メソッドで、システム グローバル トランザクション スイッチとモジュール構成に基づいてデータベース トランザクションを開くかどうかを決定します。 4) MyActionEndBehavior の run メソッドで、システム グローバル トランザクション スイッチに基づいてトランザクションを送信するかどうかを決定します。 5) 強制ロールバック

強制ロールバックが必要なコードで環境変数 DB_TRANS_VAR の値を false に設定すると、宛先メソッド終了後にロールバックされます。

4. 既存の問題

4.1 データベースの読み取りと書き込みの分離

データベースの読み取りと書き込みの分離後、TP フレームワークのメカニズムに従って、リクエストは少なくとも 2 つのデータベース接続を作成するため、現在の宣言型トランザクション実装メカニズムは接続の読み取りと書き込み 接続は、必要に応じてトランザクションを個別に管理します。

4.2 トランザクション制御の細かさ

コード化されたトランザクションと比較すると、宣言的トランザクションの最も細かい粒度は、コントローラーのメソッドレベルにのみ埋め込むことができ、コード化されたトランザクションのようにコードブロックレベルに埋め込むことはできず、トランザクション管理さえ実現できません。非コントローラーメソッドの場合。拡張予定。

4.3 データに対するトランザクションの影響

ファントム読み取り: トランザクション 1 がレコードを読み取ると、トランザクション 2 がレコードを追加してコミットします。トランザクション 1 が再度読み取ると、トランザクション 2 によって追加されたレコードが表示されます。トランザクション 1 はレコードを読み取り、トランザクション 2 はレコードを更新してコミットします。トランザクション 1 が再度読み取ると、トランザクションによって変更されたレコードが表示されます。トランザクション 1 はレコードを更新しますが、コミットは行わず、トランザクション 2 はそれを読み取ります。更新された行が取得され、トランザクション T1 がロールバックされ、T2 の読み取りは無効になります。ファントム読み取り、反復不能読み取り、ダーティ読み取りなどの問題は、データベースのトランザクション分離レベルによって解決できるため、最適化する必要があります。

データがデータ モデル層でキャッシュされている場合、システムはトランザクションの開始後に「ダーティ データ」問題を引き起こす可能性があるため、一部の重要なデータ フィールドの読み取りおよび書き込みは、そのデータに依存できないことに注意してください。キャッシュ。

4.4 分散トランザクション

分散トランザクションの問題は、データベースがサブテーブル化されている場合、またはシステムがマイクロサービス アーキテクチャを採用している場合に発生します。勉強されること。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。