« ジブリ美術館へ行きました | メイン | なんとか手の届くカラーレーザー »
2004年11月16日
MySQLで受付番号を発行する
某ECサイトで使う予定のプログラムで受け付け番号みたいなものを発行したいと思ったので、その備忘録。
例えば、RDBMS側の自動番号振り付け(MySQLの場合AUTO_INCREMENT)で受付番号を付加して新規レコードを書き込んだ後に、今書き込んだレコードを読み込めばいいわけです。
1.AがDBに書き込み
2.Aが一番最近のレコードを読み込み
しかし、もし上記2の読み込み前に他の書き込みがあった場合には違うデータを読み込んでしまうおそれがあります。
1.AがDBに書き込み
2.BがDBに書き込み
3.Aが一番最近のレコードを読み込み(←Bのレコードを読み込んでしまう)
4.Bが一番最近のレコードを読み込み
このような場合、多くのRDBMSでは、トランザクションという機能を使うと、複数の処理(SQL)を排他的にひとつのまとまりとして実行することができるので、書き込みの競合を防ぎ、データの整合性を保つことができます。
MySQLでもトランザクションはできるのですが、テーブルタイプ(フォーマットみたいなもの)をInnoDBにする必要があります。デフォルトのテーブルタイプは(おそらく)MyISAMです。MyISAMはフィールドにどんなデータが入るかあまり考えなくても気軽に使えるのですが、InnoDBの場合はデータ領域をどのように設計するかを予め考えなくてはいけません。
それもまためんどくさいので、MyISAMのままで手頃にできないのかな?と調べたら、MySQLでは、トランザクションとは別にLOCK TABLESという命令があり、これはMyISAMでも使えることがわかりました。
1.LOCK TABLES…
2.INSERT INTO…
3.SELECT…
(4.UNLOCK TABLES…)省略可
というようにすればいいわけです。
複雑な処理でもなくロック中は大した時間でもないので、トランザクションを使わずにも、これで十分かな。
もしこれに問題がありましたら教えてください。>MySQLのえらいひと
投稿者 Utayume : 2004年11月16日 15:12| 05 Work(Perl, PHP, etc)
AD
トラックバック
このエントリーのトラックバックURL:
http://ondes-martenot.info/MT/mt-tb.cgi/252