• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:cakephpでのトランザクション処理について)

cakephpでのトランザクション処理について

このQ&Aのポイント
  • cakephpでのトランザクション処理についての質問です
  • 注文番号を重複させずに採番する方法について知りたい
  • cakephpでトランザクション処理をする方法を教えてください

質問者が選んだベストアンサー

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

find('first', のとき、降順設定しないと、取得する先頭1行目は最小値だけど、そこは設定してますか? ちゃんと最大値を得るようになっていたとして、あとは、cakePHPよりは、MySQL innodb の問題じゃないかな。 http://dev.mysql.com/doc/refman/5.1/ja/innodb-locking-reads.html innodb のtransaction は、defaultは REPEATABLE READ で、select 文でのデータ取得時は、他者に読み書き可能なので、これを防ぐには、先に発行される select文に for update が必要です。これで、他者の読み書きをブロックします。 Modelの findメソッドでは、それを追加するすべはないので(接続先データベースによって対応の違う物は実装されていない) よって、 Model->query(string $sql ,array $placedata) メソッドで直接SQL文を渡して実行することになります。 プレースホルダーも使えるので、pdoでのプレースホルダー指定方法に則って作成するとよいです。 SQL例 SELECT max( number ) as number FROM exsample_models where classification=? and commoncode=? FOR UPDATE;

futsuunohito
質問者

お礼

mpro-gram様 詳細のご指南ありがとうございました。 いただいた情報にて、全て解決することができました。 すべては、mpro-gram様のご回答のおかげでございます。 検証で1000回繰り返し×3ブラウザで同時 で合計3000回処理させても1件も重複しなくなりました! (別途、Model->queryで検証した際に2回目以降の同じクエリだとキャッシュが有効になることを知らなかったため、少し嵌ってしまいましたが、それも方法が分かり解消できました。) cakephpの標準コードだけでは、for updateの完全な排他制御はできないのですね。 本当に感謝申し上げます。

その他の回答 (1)

  • kikanbo
  • ベストアンサー率31% (44/139)
回答No.1

トランザクション処理は他からの更新をロックする機能ではないから。。。

関連するQ&A

専門家に質問してみよう