/ 企画開発部
Tweet
シェア
システム開発ブログ
最近の記事
- Chrome for Androidの新機能、Chrome to Mobileを試す
- ファイルサーバのBCP対策(アイロベックスの場合)
- Illustratorの矢印機能でラクラク矢印作成!
- システム会社選びのポイント
- システム保守の移管費用を抑えます
- アイロベックス通信発行してます
- ボタンのデザインをxmlで定義する
- Excel2010で行コピーをした場合に、画像ファイルのサイズが変わらないようにする
- Power Point2010 でスライド番号をつける方法
- Photoshop の秘宝
カテゴリー
- HTML全般 (2)
- Access (15)
- Android (5)
- .NET (14)
- Excel (9)
- Google Apps (5)
- HTML5 (3)
- iPhone (8)
- JAVA (14)
- Linux (7)
- Movable Type (15)
- MySQL (7)
- OpenOffice (10)
- Oracle (6)
- PHP (20)
- SQLServer (4)
- twitter (6)
- VBA (11)
- Webサイト構築・Web戦略 (32)
- Webサイト構築事例 (4)
- Windows (10)
- その他 (29)
- アクセス解析 (2)
- ウィジェット (1)
- システム設計 (5)
- システム開発事例 (3)
- システム開発体制 (1)
- セキュリティ (5)
- データベース (20)
- プロジェクト管理 (8)
- 品質管理・テスト (6)
- 帳票 (3)
- 技術活用 (6)
- 運用・保守 (8)
部署
- システム開発事業部 (33)
- ビジネスソリューション課 (17)
- システムソリューション事業部 (32)
- 流通システム部 (76)
- 産業システム部 (93)
- ソフトウエア開発部 (56)
- Webコンサルティング部 (97)
- 企画開発部 (37)
- 部長インタビュー (3)
月別アーカイブ
- 2012年2月 (6)
- 2012年1月 (18)
- 2011年12月 (19)
- 2011年11月 (22)
- 2011年10月 (29)
- 2011年9月 (28)
- 2011年8月 (5)
- 2011年7月 (18)
- 2011年6月 (15)
- 2011年5月 (21)
- 2011年4月 (8)
- 2011年3月 (12)
- 2011年2月 (12)
- 2011年1月 (13)
- 2010年12月 (18)
- 2010年11月 (19)
- 2010年10月 (19)
- 2010年9月 (21)
- 2010年8月 (17)
- 2010年7月 (21)
- 2010年6月 (22)
- 2010年5月 (14)
- 2010年4月 (12)
- 2010年3月 (13)
- 2010年2月 (9)
- 2010年1月 (12)
- 2009年12月 (7)
- 2009年11月 (6)
- 2009年10月 (8)
- 2009年9月 (7)
- 2009年8月 (3)
- 2009年7月 (1)
- 2009年6月 (3)
- 2009年5月 (1)
- 2009年4月 (1)
- 2009年3月 (8)
- 2009年2月 (10)
- 2009年1月 (1)
- 2008年12月 (1)






企画開発部 / 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 のファンページ
他社のシステムも直します。資産を活かしてシステムリフォーム