PHP(PEAR::DB)+mySQL5でユーザー管理ツールを作成しています。

ある機能でDBを複数更新する処理があるのですが、信頼性について質問があります。

$db = DB::connect($dsn);
$db->autoCommit(FALSE); // 自動コミット解除

$rs = $db->query('UPDATE table SET data1=1'); …①
if (DB::isError($result)) {
$db->rollback();
die($result->getMessage());
}
$rs = $db->query('UPDATE table SET data2=1');  …②
if (DB::isError($result)) {
$db->rollback();
die($result->getMessage());
}
$db->commit();

質問は、上記処理(PEAR::DBを使用)において、
①が成功し②が失敗した場合に①のロールバックを保障してしてくれるかどうかです。
実験ではうまくいっているようなのですが、みなさんのご指摘があればよろしくお願いいたします。

※ 普通ならPDOでアクセスするんでしょうが、よろしくおねがいいします。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:2009/11/23 13:11:29
  • 終了:2009/11/23 13:51:17

ベストアンサー

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402009/11/23 13:42:28

ポイント60pt

$db->autoCommit(FALSE); // 自動コミット解除

自動コミットをオフにするということは逆説的にトランザクションを開始することを意味します。


そして rollback を行う事は「トランザクション開始以降のすべての変更」を元に戻すことを意味します。

(シーケンスの類など一部例外はありますが)


①が成功し②が失敗した場合に①のロールバックを保障してしてくれるかどうかです。

これは接続方法に関係なく、「MySQL」が保証してくれます。


注意点としては MySQL でトランザクションを使用する前提となる

InnoDB などのテーブルを使用することだけです。( MyISAM は不可 )

id:cochoo

rollbackの定義である「トランザクション開始以降のすべての変更」の「すべて」がずっと気になっていました。

「すべて」というのが「トランザクション開始=autoCommit実行時」~「commit」内で処理されたということで認識できました。

この点がわかりやすく書かれている文献が見当たらなかったもので、b-windさんの説明ですごくよくわかりました!!

DBエンジンは、おっしゃるとおりInnoDBにしております。

ありがとうございました。

2009/11/23 13:50:57

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません