[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 メーリングリストの案内