« ジブリ美術館へ行きました | メイン | なんとか手の届くカラーレーザー »

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

ベルメゾンネット ニッセン セシール ムトウ IMAGEnet DHCオンラインショップ 白鳩/京都発インナーショップ

トラックバック

このエントリーのトラックバックURL:
http://ondes-martenot.info/MT/mt-tb.cgi/252

AD

Mac ソフトのことなら act2.com デル株式会社 ioPLAZA【アイ・オー・データ直販サイト】 Just MyShop(ジャストシステム)