ThinkPHP フレームワーク関連付けモデル実装の詳細な分析 (PHP を使用してトランザクションの一貫性を確保する方法)
ThinkPHP バージョン: 3.0
Mysql テーブル エンジンがトランザクションをサポートしていない場合、3 つ以上のデータ トランザクションの一貫性を確保するにはどうすればよいですか?
ThinkPHP には関連モデルがあるので、詳しく調べました
テーブル 2 つ
ユーザーテーブル:'
userRole テーブル
userRole テーブルの user_id は、User テーブルのプライマリ ID です
非常にシンプルなテーブル
次に UserModel.class.php を設定します
設定が完了しました。次に、アクションメソッドを記述します。
public function add(){ $data['username']='zpass'; $data['password']='password'; $data['email']='email'; $rs=D('User')->relation(true)->add($data); dump($rs); }
最初に add メソッドを実行します。
relationship の下を検索すると add メソッドはありませんが、__call メソッドは存在しますが、add メソッドは存在し、Model.class.php を継承しているため、この add メソッドは非常に単純なので実行されません。最初に実行される Model.class.php メソッド
レコードがユーザーテーブルに挿入されます
次に、_after_insert メソッドが実行されます
このメソッドは Moel.class.php の空のメソッドであり、何も行いません
しかし、relationModel.class.php ではオーバーロードされていたため、relationModel.class.php の _after_insert メソッドが実行されました。
このメソッドは、まず定義された関連付けモデルがあるかどうかを判断し、定義されている場合はそれを実行し、引き続き userRole テーブルに挿入します。
PHP で MySQL のようなトランザクションを実装する方法については、実際には誰も存在しないか、まだ見つけていません。現時点で良い方法は、2 番目の SQL が失敗したときに最初のトランザクションに戻って削除することです。