システム開発ブログ/ 企画開発部 Yahoo!ブックマークに登録 Google ブックマーク はてなブックマーク Livedoorクリップ シェア

システム開発ブログ

Twitterでilovex_officialをフォローしてください

最近の記事

カテゴリー

部署

月別アーカイブ

以前の部署別ブログ

PEAR MDB2+MySQLのトランザクションについて

中村(次)
中村(次) (2010年7月16日 13:40)
企画開発部 / PHP

先日、MDB2+MySQLのトランザクション処理でハマりにハマりました。

とある画面をテストしているとトランザクションが
まったく効いていないことがわかったので、
原因調査を始めたのですが、そもそも、トランザクションが効いている機能と、
まったく効いていない機能がありました。

トランザクションが効いている画面は、単純なマスタ登録の画面でした。
そして、トランザクションが効いていない画面は、いろいろな複雑な処理が実装さている画面でした。

いろいろと検証しているうちに、以下のことがわかりました。

「一回の処理の中で、複数のコネクションを取得した場合、
2回目以降は自動コミットがONになる。」

どういうことかというと、
トランザクションが効かない画面で行っていた処理は以下です。

1.チェック処理実行
2.最大のMAX連番を取得
3.連番をキーに、データをINSERTする

ごくごく普通の処理に見えますが、問題は1のチェック処理にて、
コネクションを取得しているという点でした。

トランザクションを開始するのは、あくまで2のタイミングなのですが、
1でコネクションを取得しているので、
2でコネクションを取得し、トランザクションを開始しても、
この時点で、オートコミットがONになってしまいます。

MDB2/Driver/mysql.php中のbeginTransactionメソッドに、
以下のような実装があります。

$query = $this->start_transaction ? 'START TRANSACTION' : 'SET AUTOCOMMIT = 1';

既にトランザクションが開始されていたら、ONにするというものでした。
ソースを見る限り、コネクション開始だけでは問題なさそうなのですが、

1、2、3、のそれぞれの処理の合間に、
「select @@autocommit」でオートコミットが有効になっているか確認したところ、
2のトランザクション開始時に"1"に変わることがわかりました。

とはいえ、1回の処理で複数のトランザクション処理を
実装することもあると思います。
その場合も、上記の設定だと、
2回目以降はオートコミットがONになってしまうので、
トランザクションが効かないことになります。

今回は、上記の部分を以下のように変更して対応しました。

$query = 'START TRANSACTION';

トランザクションを開始したら、単純に開始するようにしました。
正直、なぜ「開始していたらオートコミットをONにする」
となっているかはわかりませんが、
「トランザクションを開始したら、トランザクションを開始する」
でいいと思います。

ひょっとしたら、コミット処理などの実装漏れを
考慮いているのかもしれませんが、
その場合でも、「既にトランザクションが開始している場合は、コミットする。」
と以下のようになっている方がいいと思います。

$query = $this->start_transaction ? 'START TRANSACTION' : 'COMMIT';

MDB2+MySQL+トランザクションで迷ったら、一度上記を見てみてください。

「システム開発ブログ」へのコメントやご意見等ありましたら、 ファンページまでお願いします。  Facebook のファンページ

お問い合せ・情報はこちらの電話番号におかけください:03-3232-2525 お問合せ・資料請求はこちらをクリックしてください
ページのトップ
システム開発・一括受託開発。見積依頼受付中

システム開発専用サイト

システム開発の流れ・手順、実績など。アイロベックスのシステム開発を紹介。

VB .NETを主言語としたWebアプリケーションの開発

要件分析から保守まで、お客様の現場での問題解決だけでなく、IT経営の援護者としてトータルソリューションサービスを提供しています。

MovableType を使ったウェブサイト構築

魅力あるウェブサイトデザイン、構成はもとよりMovableTypeを使用したウェブサイトの作成、JAVA、CGIによる注文フォームの作成等、ビジネスを強力にサポートします。

フォルダーアクセス権限確認ツール『AD-Folder』

Windowsフォルダーアクセス権限確認ツール

フォルダーアクセス権限を一目で確認。使用版を無償でご利用いただけます。

スクール運営を応援する講座情報管理システム『CMS+AD for School』

Webとリアルをつなぐコンテンツマネージメントシステム

Webサイト・モバイルサイト・チラシ(PDF)・カタログ(InDesign)を、簡単かつ正確に作成できます。

「システム開発ブログ」の更新情報をTwitterで。

Twitter公式アカウントに認定されています

「システム開発ブログ」の更新情報をTwitterで。ぜひ、フォローをお願いします。