Out of Memory

本ブログは更新を停止しました。Aerieをよろしくお願いいたします。

目次

Blog 利用状況

ニュース

2009年3月31日
更新を停止しました。引き続きAerieを御愛顧くださいませ。
2009年2月3日
原則としてコメント受付を停止しました。コメントはAerieまでお願いいたします。
詳細は2月3日のエントリをご覧ください。
2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

αετο? / aetos / あえとす

シャノン? 誰それ。

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

書庫

日記カテゴリ

登録前データチェック

# DB音痴が書いてます。突っ込みどころ満載だと思います。
# ヘタレなりに精一杯考えているので、生暖かい目で見つめてやってください。

何らかのデータをDBに登録する画面を考えます。
登録前にデータをチェックします。

書式エラーのような単純なものなら、UI層だけで対応可能です。
ただ、コードの重複エラーのようなものの場合、DBを見に行かないと判断できません(画面からコードを入力させることもあります)。

全てのチェックをパスして、(ハードウェアエラー等の予期できないエラーが発生しない限り)確実に登録に成功する状態にしてから「登録してもよろしいですか?」という確認を出すのが、(少なくとも今の仕事では)好まれています。
途中チェックで引っかかった場合は、「○○がダメなので登録できません」と出します。
「登録してもいいですか?」→「○○がダメなので登録できません」という流れは嫌われます。

相手は複数のクライアントからアクセスされるDBサーバですから、排他制御をしなければなりません。
単純なチェックだと、チェックした時点から実際に登録する時点までに、他の人がデータを更新してしまって、登録NGになるケースがあり得ます。
他人のINSERTを防ごうと思ったら、対象テーブル全てをテーブルロックするしかないでしょうか。

しかし、ロックはリスクを伴います。
例えば、上記のような実装で、「登録してもいいですか?」というメッセージが出ている間はロックを維持していなければなりませんから、馬鹿なオペレータがメッセージボックスを出したまま放置してしまったりすると、他のオペレータの仕事が止まります。
「おいロック掴んでるの誰だー!?」「あ、すいません俺です」「ったく気をつけろ!」みたいな会話が飛び交います。
ロックは最小限にしたいものです。

DBならロックという手がありますが、ファイルの場合はそうも行きません。
ファイルの有無を確認して、無ければ作るなどという実装は、確認してから作るまでの間にロックをかけることができないため、試しに作ってみて、できたかどうかで判定しなければなりません。
この考えをDBに持っていくとどうでしょう?
つまり、「これから登録しようとしているコードが登録済みかどうか調べ、無ければテーブルをロックする」代わりに、「試しに登録してみて、エラーが出たらコード重複と判断する」というものです。
この場合、「登録してもよろしいですか?」というメッセージが出ているときには、既に登録作業は全て終わっており、このメッセージは「コミットしてもよろしいですか?」という意味になります。
ただ、UIからDBに、登録リクエストとコミットリクエストを分けて投げなければいけないという欠点はあります。

データチェックは「登録してもよろしいですか?」というメッセージを出す前に全て終わらせておくという考えが良くないのでしょうか。
こういう場合、どうやるのが定番なんでしょう?

投稿日時 : 2008年3月3日 13:34

Feedback

# re: 登録前データチェック 2008/03/03 13:56 NAL-6295

はじめまして、NAL-6295と申します。

私の場合は、

全ての検証

「登録してもよろしいですか?」→no→終わり
↓yes
同じく全ての検証(もしくは、データの検証のみ)

登録処理

という手順を踏んでます。

# re: 登録前データチェック 2008/03/03 13:57 Mr.T

Mr.Tです、こんにちは。

どんなにシビアにしてもチェックと更新の
間には他の更新が入り込む可能性が
あるとおもってます。

入れてみたらOK
入らなかったらダメ。
この二つの神様しかInsertにはないです。

#あ、Oracleには「データがなかったらInsert
#存在するならUpdate」ってコマンドが
#あったんだっけ?

>「登録してもいいですか?」→「○○がダメなので登録できません」という流れは嫌われます。

登録してもいいですか?より、
「確認を行っています...」
で成功したら「登録完了しました」
でいいんじゃないかなと。

# re: 登録前データチェック 2008/03/03 14:16 まさる

今までの仕事は大体、

チェック

「登録してもよろしいですか?」

チェック →NGなら「他で更新されました。もう一度最初からやり直してください。」

OKなら「登録されました。」

のパターンでした。

>#あ、Oracleには「データがなかったらInsert
>#存在するならUpdate」ってコマンドが
>#あったんだっけ?
MERGE INTOですね。

# re: 登録前データチェック 2008/03/03 14:19 Ognac

教科書的に講釈を垂れると、機知のように以下になりますが、これでは野暮ったいんですね。wwww
楽観的排他は、Insert時の重複は避けられません。Update/deleteも同様です。
悲観的ロックは本文にあるような問題やDeadLockの考慮が必要で煩雑になります。
更新/Delete時
1:更新アクションの前段で 既存のレコードの 更新日付を取得する
2:項目を更新する.
3:update 文.... where 更新日=取得した更新日 で更新する
DBからの例外をハンドリングする。
挿入時
1: insert tbl(f1,f2)value(f1,f2)
2: 他端末から同一キーが登録されていたら、重複例外をハンドリングする。

過去に次のように実装したことがありました。
サロゲートキーを主キーにしていると思ってください。
xxxマスター
ID code value
10 A 神戸
20 B 大阪

端末 TAN-A から "C 名古屋 " で新規登録する際

登録画面をキー確定画面 と内容確定画面の二画面に分けて
キー確定画面で
insert xxマスター(code) value (c)  で1レコード作っておいて
内容確定の時は
  update 文で更新する.
もちろんこの場合も update文の 更新日による排他は不可避なんですが、「挿入時の登録できねぇ」の確立は減るのでは。と思うのです。

コーディングの負荷は増えますが、テーブルに手動排他項目を設置して、操作員が"他人は使うな" 宣言を可能にするのも手です。

# re: 登録前データチェック 2008/03/03 14:30 れい

> データチェックは「登録してもよろしいですか?」というメッセージを出す前に全て終わらせておくという考えが良くないのでしょうか。

「全て」チェックしようと思ったら、
ユーザーに確認プロンプトしてる間、
DBに接続しつづけたり、
なにか状態を保存してないと(=Lock)いけませんよね。

でも、DBは別サーバーなわけで、
いつ死ぬかわからないし、接続がきれるかもしれません。

すると、「登録してもよろしいですか?」のあと、
OKを押しても、失敗する可能性もあるわけです。
だから絶対に登録可能な状態でユーザーにプロンプトするのは不可能ですよね。

さて、このハードウェアレベルに近いエラーと、キーが重複してたりコードが違うといったレベルのエラーと、
何が違うのでしょうね?

事前チェックが可能な項目は、ユーザに確認する前にチェックできる。
事前チェックが不可能な項目は、ユーザに確認する前にチェックできない。

最近のDBは他にも手があるようですが。

DBを疎な結合にする意味・意義を考えると答えがわかるかと。

# re: 登録前データチェック 2008/03/03 15:56 まどか

以前、自治体の窓口業務をしてましたので、Ognacさんの書かれたようなことをしてました。

処理ごとに排他しなければならない住民コードや世帯コードがあり
処理前に使用するキーの値を専用テーブルへInsertします。
Okなら排他宣言成功、失敗なら使用中ってことで。

当然、関連のある処理すべてがプログラムレベル同じことをしなければなりません。
忘れてならないのが、障害などにより残ってしまってそのキーへアクセスできなくなる状態です。
いわゆるツールメニューに「クリア」処理として公開する必要があります。

# re: 登録前データチェック 2008/03/03 16:39 黒龍

まずロックというのは限りなく短い必要があってDBでのトランザクションがこれにあたります。でユーザの対話をまたぐものはロングタイムトランザクションと呼ばれるのですがこれはDBの機能ではなく作りこむ機能です。今回のようなケースはこっちに当たると思うんですがやりたいことによって実装はかなり変わってきます。
キーを別に設けてインサートした後のチェックにしてしまう方法、完全にロックの仕組みを設けてしまう方法(座席予約みたいなの)などが一般的だと思います。
が、色々悩ましい問題(以上終了時のロックデータ等)が出てくるのも確かなので登録して駄目ならキー値を再入力が作る側からすると断然楽です。ユーザは登録のNGを嫌いますが全ての項目の再入力さえなければ工数との兼ね合いで許容してくれるように思うのですが・・・。

# re: 登録前データチェック 2008/03/03 17:56 オノデラ

>>#あ、Oracleには「データがなかったらInsert
>>#存在するならUpdate」ってコマンドが
>>#あったんだっけ?

>MERGE INTOですね。

SQL Server もようやく 2008 から対応になるようです。

# re: 登録前データチェック 2008/03/03 18:44 Mr.T

>SQL Server もようやく 2008 から対応になるようです。
うれしー、これがあるとロジック二つにわけなくてもすむよ。

# re: 登録前データチェック 2008/03/04 0:11 シャノン

えと、全部読んでますけど頭がいっぱいになりそうですorz

# re: 登録前データチェック 2008/03/04 0:55 やじゅ

排他って何だろう
http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/9904/lock/

# 月間ページビュー 2008年3月 2008/04/20 22:35 Out of Memory

月間ページビュー 2008年3月

# LCKnEujsqlSmITSwjG 2014/08/04 3:40 http://crorkz.com/

KlTLiW Great article.Much thanks again. Keep writing.

# gLVdglobdSZBHPLDB 2014/08/05 5:05 http://crorkz.com/

VEULXv A round of applause for your article.Thanks Again. Want more.

# bYngYZmkPhVoTiYvXY 2014/09/08 19:42 http://www.arrasproperties.com/

great points altogether, you just received a brand new reader. What may you recommend in regards to your put up that you simply made some days in the past? Any positive?

# ZAEFbxtDzZ 2014/09/10 17:28 https://www.youtube.com/watch?v=6l8bpZ0oY_M

I used to be recommended this web site by means of my cousin. I am not sure whether this submit is written through him as no one else recognise such certain about my trouble. You're wonderful! Thanks!

# gxxkqKketIsNLHJ 2014/09/12 18:15 https://www.youtube.com/watch?v=jtXyUiBeflE

Hey! I simply would like to give an enormous thumbs up for the good information you've got right here on this post. I will be coming again to your weblog for extra soon.

# Proeroids - Buy Anabolic Steroids Online 2017/02/09 4:03 Davidtic

Proeroids - Buy Anabolic Steroids Online http://proeroids.com - More info...

# Capital one case study interview academic 2018/01/06 10:10 Gilberto31

We suppose that barely a skilful paragrapher can genius academic content that’s nothing stubby of correct http://sameday-essay.com/pdf-essay-writing/the-key-at-the-rear-of-composing-an-excellent-company-investigation-document/ and brings the largest results. Cooking as a hobby essay. Every online essay writer in our network has a foul track-record of providing check in and writing support to students. Absenteeism in the workplace essay

# Argumentative essay about gay language graduate 2018/01/07 11:21 Cory76

We believe that alone a able writer can ship speculative fulfilled that’s nothing short of fulfilled http://essaysondeadline.com/college-essay-writer/how-you-can-create-a-good-argumentative-composition-upon-any-kind-of-subject/ and brings the most skilfully results. Essay on true love means sacrifice. Every online essay writer in our network has a concentrated track-record of providing check in and scribble literary works assistance to students. Essay on solids liquids and gases

# The importance of giving back to your community essay article 2018/01/14 5:13 Michel39

We imagine that just a skilful correspondent can genius academic size that’s nothing stubby of fulfilled http://whiteessay.com/pdf-essay-writing/create-much-better-professional-summaries/ and brings the paramount results. Is international law effective essay. Every online attempt journo in our network has a foul track-record of providing into and scribble literary works aid to students. Placement papers of pipal research

# Колун купить в тюмени
2018/05/10 1:15 CynthiamaM

Сюжетные локации представлены по образу отдельными элементами, эдак да масштабными постройками

https://imtechnology.ru/%D0%BC%D0%BE%D0%B9-%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9-%D0%B3%D0%BE%D0%B4-%D0%B0%D0%BB%D1%8C%D0%B1%D0%BE%D0%BC-%D0%BF%D1%80%D0%BE-%D1%82%D0%BE-%D0%BA%D0%B0%D0%BA-%D1%8F-%D1%80%D0%B0%D1%81%D1%82%D1%83/ Мой первый год альбом про то как я расту
https://seryakov-stroy.ru/%D0%BF%D0%B0%D1%80%D0%BA%D0%B0-12-63-12-63-tw007ewxga26/ парка 12 63 12 63 tw007ewxga26
https://bon-net.net/%D1%85%D0%BE%D1%82%D0%B8%D0%BD%D1%81%D0%BA%D0%B8%D0%B9-%D0%BC-%D1%81-%D1%87%D0%B0%D1%80%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%BE-%D0%B8-%D1%82%D0%B0%D0%B8%D0%BD%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F/ Хотинский М.С. Чародейство и таинственные явления
https://toeflmoscow.ru/xiaomi-piston-air-capsule-earphone-white-gold/ xiaomi piston air capsule earphone white gold
https://obuchaemuspekhu.ru/%D0%BF%D0%BE%D0%BB%D0%BE-mini-maxi-%D1%84%D1%83%D1%82%D0%B1%D0%BE%D0%BB%D0%BA%D0%B0-%D0%BF%D0%BE%D0%BB%D0%BE/ поло mini maxi футболка поло
https://zivoi.com/%D1%81%D0%B2%D0%B8%D1%82%D0%B5%D1%80-%D0%B4%D0%BB%D1%8F-%D0%BF%D0%BE%D0%B4%D1%80%D0%BE%D1%81%D1%82%D0%BA%D0%B0-%D0%BC%D0%B0%D0%BB%D1%8C%D1%87%D0%B8%D0%BA%D0%B0/ Свитер для подростка мальчика
https://ackcompetition.com/%D0%BA%D0%BE%D0%BB%D1%8B%D1%88%D0%BA%D0%B8-%D0%BC%D0%B5%D1%82%D0%B0%D0%BB%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5-25-%D1%81%D0%BC-10-%D1%88%D1%82/ Колышки металлические 25 см 10 шт
https://gymn166-spb.ru/%D1%8E%D0%B2%D0%B5%D0%BB%D0%B8%D1%80%D0%BD%D1%8B%D0%B5-%D0%BA%D0%BE%D0%BB%D1%8C%D1%86%D0%B0-karmonia-%D1%81%D0%B5%D1%80%D0%B5%D0%B1%D1%80%D1%8F%D0%BD%D0%BE%D0%B5-%D0%BA%D0%BE%D0%BB%D1%8C%D1%86%D0%BE-%D1%81-%D0%BE%D0%BF%D0%B0%D0%BB%D0%B0%D0%BC%D0%B8-%D0%B8-%D1%81%D0%B0%D0%BF%D1%84%D0%B8%D1%80%D0%B0%D0%BC%D0%B8/ Ювелирные кольца KARMONIA Серебряное кольцо с опалами и сапфирами.
https://ces-kam.ru/%D0%BA%D1%83%D0%BF%D0%B8%D1%82%D1%8C-%D0%BB%D0%B0%D0%B2%D0%B0%D1%86%D1%86%D0%B0-%D0%B2-%D0%B7%D0%B5%D1%80%D0%BD%D0%B0%D1%85/ Купить лавацца в зернах
https://sotnikovka.ru/what-washington-gets-wrong/ What Washington Gets Wrong

タイトル
名前
Url
コメント