ある機能で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でアクセスするんでしょうが、よろしくおねがいいします。
$db->autoCommit(FALSE); // 自動コミット解除
自動コミットをオフにするということは逆説的にトランザクションを開始することを意味します。
そして rollback を行う事は「トランザクション開始以降のすべての変更」を元に戻すことを意味します。
(シーケンスの類など一部例外はありますが)
①が成功し②が失敗した場合に①のロールバックを保障してしてくれるかどうかです。
これは接続方法に関係なく、「MySQL」が保証してくれます。
注意点としては MySQL でトランザクションを使用する前提となる
InnoDB などのテーブルを使用することだけです。( MyISAM は不可 )
rollbackの定義である「トランザクション開始以降のすべての変更」の「すべて」がずっと気になっていました。
「すべて」というのが「トランザクション開始=autoCommit実行時」~「commit」内で処理されたということで認識できました。
この点がわかりやすく書かれている文献が見当たらなかったもので、b-windさんの説明ですごくよくわかりました!!
DBエンジンは、おっしゃるとおりInnoDBにしております。
ありがとうございました。