ホームページ  >  記事  >  バックエンド開発  >  ThinkPHP フレームワーク関連付けモデル実装の詳細な分析 (PHP を使用してトランザクションの一貫性を確保する方法)

ThinkPHP フレームワーク関連付けモデル実装の詳細な分析 (PHP を使用してトランザクションの一貫性を確保する方法)

WBOY
WBOYオリジナル
2016-06-13 12:49:551096ブラウズ

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 テーブルに挿入します。

結論

ThinkPHP のアソシエーション モデルは、userRole テーブルが存在しない場合にのみ、2 つのテーブル間のトランザクションの一貫性を保証できません。 user テーブル そうでなければ、userRole テーブルも存在しません。

PHP で MySQL のようなトランザクションを実装する方法については、実際には誰も存在しないか、まだ見つけていません。現時点で良い方法は、2 番目の SQL が失敗したときに最初のトランザクションに戻って削除することです。

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