質問: 予約システムに排他制御が必要なのは何となく分かるのですが、それ以外については不要なのでしょうか? 例えば、掲示板では、排他制御を導入していないとどうなるのでしょうか? ・同時刻に千人単位で書き込んだら、同じレコードidに書き込みが混在する? ・それとも、AUTOINCREMENT設定しておけば、通常通り自動採番??? 何か処理をして、対象のステータス数に影響を及ぼすもの以外は、気にする必要はないのでしょうか? 前提 ・InnoDB
回答: データベースで排他制御というと、トランザクション分離レベルなどのことでしょうか。 > > ・同時刻に千人単位で書き込んだら、同じレコードidに書き込みが混在する? > > ・それとも、AUTOINCREMENT設定しておけば、通常通り自動採番??? > > > InnoDBの詳細は確認していないので一般論ですが、RDBMSのAUTOINCREMENTの類は同時実行のことを考慮されているでしょうから、INSERTが同時に走っても同じ値が採番されることはないはずです。ただ同じようなことを `(select max(id) from hoge) + 1` のように書いてしまうと同じ値が採番される可能性があります。ちょうど、「列に格納したカウンタをインクリメントして、1000を超えるときはロールバックしたい」という質問を先日見かけました: READ UNCOMMITTED をむしろ使いたい状況? データベースで排他制御が必要になるのは、今のデータに基づいて操作を行う必要があり、途中で変更されると困る場合です。値の変更もそうですが、レコード数に依存していれば追加削除の影響もうけますし、別レコードのIDを入れたいような場合に相手レコードが消えたりするのも問題になります。 とはいえ、これが問題になるとは限りません。後で修正すればいいとか、時間をかけてでもリトライすればいいという場合もありますし、失敗として諦めることができる場合もあります。処理の手順を変えることでこのような問題の一部またはすべてを回避できることもあります。 先ほどのID採番にしたって、仮に同じ値が採番されたとしても、UNIQUE制約や主キー制約が設定されていればINSERTができません。ユーザーからすると再送信の必要があるかもしれませんが、DB上のデータが壊れてしまうことはないので、ユーザーに我慢してもらえば済む話、と捉えることは可能です。 そういう意味では、お金や責任が絡んでこないうちは深く心配する必要はないかもしれません。