
SQL Server 2008 です。
在庫管理DBを作ろうとしています。
複数のクライアントから一つのレコードに更新が発生した場合を考えています。
複数のクライアントから同一のストアド(在庫引落)を読んだ場合
呼ばれたストアドは同時に複数走るのでしょうか、一つずつ走るのでしょうか?
こんな時(在庫引落)はストアドにパラメータを渡すよりも、一時テーブルに
書き込んで、トリガーで更新(引落)ってな事をした方がいいのでしょうか?
その場合トリガーも同時に走るのでしょうか?一つづつでしょうか?
複数のクライアントから更新がかかり、直接レコードを更新出来ないような
場合はSQLではどう処理するのがメジャーなんでしょうか?
オフコンでは仮想記憶って云うのがあって、そこに書き込むとバックグランドで
ウェイティングしていたプログラムが一件ずつ読み込んで更新する仕組みでした。
更新が終わると、また読込みでウェイティングする仕組みです。
複数の端末から一つの仮想記憶に書きこみ、読込みはシーケンシャルで一件ずつですので、
在庫がマイナスになることは合っても、整合性が取れなくなることはありませんでした。
こんな仕組みでSQLに移行したいと考えています。
No.3ベストアンサー
- 回答日時:
原則論から言えば「トリガは使わなくて済むならばできるだけ使わないようにする」が正しいです。
ただし、私はトリガーでやっていいケースはあると考えています。
・その2つのテーブルの間に極めて密な関係がある(例外なく反映させる)
・1つのテーブル以外はアプリケーションサイドで通常更新対象と認識されていない
・複数のルートでテーブル更新が掛けられる可能性がある
・ユーザがトリガーを無効にできる権限を持っていない
具体的には数十万件の取引データからリアルタイムの累積残高を取得・表示させるための残高テーブルの更新にトリガを使用したことがあります。
今回のケースはストアドでもトリガでやってもいいケースだと思いますが、以下の点は留意してください
・SQL Serverには行トリガがないので、複数更新が掛けられたときの処理を組み込む
(複数行更新は不可とするか、全部が在庫条件を満たしたときだけOKとする)
・在庫がマイナスになる場合はトリガ内でRAISERRORを発行する
・呼び出し元(ストアドでもアプリでも)はエラートラップが必須
No.2
- 回答日時:
>複数のクライアントから同一のストアド(在庫引落)を読んだ場合
>呼ばれたストアドは同時に複数走るのでしょうか、一つずつ走るのでしょうか?
ストアドプロシージャは同時に走りますが、処理の中で同じレコードに対する排他ロックを取得できなかった方は待つことになります。だから通常はレコードをロックする時間が極力短くなるようにコーディングします。
#1さんの書かれた通り、質問者さんの懸念されている内容はDBMSの本質の問題(それが起きたらDBMSじゃないでしょうというような)な気がします。
この回答への補足
排他ロックがかかるのは解っていたのに、疑問点とやりたい事が
ごちゃ混ぜになった質問をしてしまいました。
そこで再度質問ですが、
出庫データが累積テーブルに書き込まれたらトリガーで在庫から
引き落とす仕組み(insertの数量を引落、deleteの数量を戻し)を
作ろうと考えたのですが、これは普通のやり方でしょうか?
それともストアドへキーと数量を渡し在庫の更新が完了後
累積テーブルに書き込む方がいいのでしょうか?
複数の端末から同時に同じ物を出庫されると入力画面のチェック時
は在庫不足にならなくても、更新時にマイナスになることは想定しています。
これもトリガーで在庫が更新された時に確認しマイナスの場合は
何らかのアラームになるような事を考えています。
これまでトリガーは履歴の採取にしか使っていなかったのですが、
トリガーをこんな風に利用してもいいのでしょうか?
(トリガーはこんな風に利用するものなのでしょうか?)
No.1
- 回答日時:
何のために、DBMSを使っているのですか?
DBMSを使う理由の一つが、排他制御で同時更新を抑止したり、トランザクションといった単位で複数の表、複数の行の更新を有効にしたり無効にしてデータの整合性が保証されることですよね?
>何のために、DBMSを使っているのですか?
駆け出しの性で使う理由を考えて使っているわけではありません。
PCの素人がエクセルを使う様な感じです・・・
再度自分の文章を読み直してみて、やりたい事と質問も合いません。
ご指摘通り通り大きな考え違いをしていたようです。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- その他(データベース) c言語の問題です。これを踏まえてコーディングしたいのでおしえていただきたいです。 3 2023/08/03 09:27
- メルカリ メルカリShopsを作るとメルカリで販売は楽になりますか メルカリとまったく変わりませんか? 2 2022/10/11 19:22
- Chrome(クローム) 最近のGoogle Chromeのデータ読み込みの遅延やエラーって頻発しますか? 2 2023/01/06 22:12
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- ライブ・コンサート・クラブ この件についてどう思うか教えてください とあるイベントチケットに行きたく、Twitterで譲渡してく 3 2023/04/08 23:37
- Excel(エクセル) Excelでデータを抽出するに良い方法 9 2023/02/06 12:42
- 借地・借家 賃貸の違約金と更新について 4 2023/08/25 00:29
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLServer 分散トランザクショ...
-
トリガが完全にかからない
-
EXCELのマクロ
-
SQLでORを略す方法
-
ストアド、トリガーの同時呼出
-
「マスタ」と「テーブル」の違...
-
Access VBA [リモートサーバー...
-
テーブルのレコード削除ができ...
-
Accessにインポートしたら並び...
-
ACCESS2007 フォーム 「バリア...
-
SQL Server のデータをCSVファ...
-
DataTableから条件を満たした行...
-
ACCESSのSQLで、NULLかNULLでな...
-
sqlserverで集計結果をUPDATEし...
-
クエリのキャンセルがいつにな...
-
SELECT文でのデッドロックに対...
-
Oracleの排他制御について教え...
-
オラクルではできるのにSQLSERV...
-
既に使用されているので、使用...
-
SELECT時の行ロックの必要性に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLServer 分散トランザクショ...
-
ストアドプロシージャの多用で...
-
トリガが完全にかからない
-
エクセルアドインの使用方法に...
-
ストアドプロシージャーのパラ...
-
ストアド、トリガーの同時呼出
-
ストアド更新履歴
-
SQLServerでOracleシーケンスの...
-
SQLServerのトリガ機能について...
-
ストアドプロシージャ
-
ストアドでコンピュータ名の取得
-
SQL Serverトリガの中でDMLの種...
-
SQL Server INSERTのトリガで採番
-
SQLServer7.0 重大な例外「EXCE...
-
ADOからのストアド実行でエラー...
-
ストアドプロシージャでのファ...
-
NETWORKDAYS関数について
-
関数の戻り値の確認について
-
SELECT時の行ロックの必要性に...
-
「マスタ」と「テーブル」の違...
おすすめ情報