[PHP-users 23927] Re: DB_DataObjectのトランザクション制御
丸山 宏徳
kutsugi @ avis.ne.jp
2004年 12月 16日 (木) 14:39:28 JST
今日は「もしかしたら恥ずかしいかもしれない」自己Resです。
えっと、あの後改めてDB_DataObjectのソースをよく読んでみたのですが……
「これ、もしかして、PHP5なら全部共通のトランザクションかかるんじゃねーの?」
と思い立ち、頂いたサンプルコードをちょっといじって試してみたところ……
かかりました(^^; こんな感じで確認しました。
・rollbackパターン
(1)てきとーなテーブル1でDB_DataObject::factoryする
(2)同じくてきとーなテーブル2でDB_DataObject::factoryする
(3)(1)のオブジェクトからgetDatabaseConnectionメソッドでDBオブジェクト
を取り出す
(4)(3)のDBオブジェクトで自動commit解除とトランザクション開始を指示
(5) (1)と(2)の両方をいぢってinsertやらupdateする
(6) 両方のテーブル内容をダンプ
(7)(3)のDBオブジェクトでRollbackする
(8) もっかい両方のテーブル内容をダンプ
・commitパターン
(7)をrollbackからcommitに修正しもう一度実行
……で、他に何にもしなくても、このコードで両方のDB_DataObject派生オブジェ
クトにトランザクションがかかります。 SQLiteとMySQL(InnoDB)で確認しま
した。
これ、承知して使ってれば便利だけど、知らないと危険ですよね? どんな
DB_DataObject派生オブジェクトも、ぜんぶ同じトランザクションで動くわけで
すから。こんなTips、ありましたっけ?
>ALL
(……って、DB_DataObjectの情報そのものがあんまりないし(苦笑))
「対象がオブジェクトの場合、=演算子は全て参照渡し」という変更が、こんな
ところにも効いてきているんですね。
追伸1
SQLiteのINTEGER PRIMARY KEYは、ロールバックすると値が戻るようですね。
追伸2
MySQL4.1、うまく動きません(^^; 今回の為にわざわざ4.0.21に戻しました。
丸山 宏徳
E-Mail:kutsugi @ avis.ne.jp
PHP-users メーリングリストの案内