IDの自動付与について
2019-07-03 15:07
現在、あるシステムをCELFに移行するために、色々と試行錯誤しております。
現在のシステムで、すでにID(オートナンバーで自動採番)を使用しており、そのIDをもとに、他のテーブルと紐づけを行っております。
(現在のシステムで使用しているIDをAIDとさせていただきます。)
※現在テーブルにはCELF上で自動で発番されるIDと、現在のシステムで利用しているAIDの2つのIDが存在しております。
CELF上で新規でデータを登録する際に、AIDを新規発番するにあたり「テーブルから複数件取得する」アクションを用いて、AIDを降順に5件抽出して、最後のAIDに1カウントアップした数字を、新規のAIDとして発番しておりましたが
同時に登録処理を行ったときに、AIDが一意にならないことを懸念しております。
SQLの構文でFOR UPDATEでロックをかけれそうだったので、AIDを抽出する際にロックをかけて、発番するようにしようと思ったのですが、
処理を始める「begin transaction」とロックを解除する「rollback」のコマンドが「SQLが正しくありません。」と表示され、保存することができません。
ロックを解除できないと、ロックしたままの状態になってしまう気がしていて、、、、
SQL-92に準拠はしていそうですが、何かできない原因がありましたら、ご教授いただけませんでしょうか?
もしくは、AIDにカウントアップしていく形で新規発番するCELFの機能等ありましたら、教えていただけますと幸いです。
質問がわかりづらく、申し訳ございませんが、何卒よろしくお願いいたします。
回答を投稿するにはログインが必要です。
ご回答いただきありがとうございます。
いただいた「データ更新を一括実行する」では排他制御できなそうですね、、、
ご丁寧にありがとうございました。
> 日本コンピュータシステム(CELFチーム) さん
わかりづらい質問に対して、ご丁寧にご返信いただきありがとうございます。
お二方とも、同じような方法でカウントアップすることをお勧めしてくださったので、そちらでやってみようと思います。
管理テーブルもしくはコントロールテーブルを作成することは、今後のシステムを作る上で、大変参考になりました。
ありがとうございます!
なお、「データ更新を一括実行する」アクションですが、これはアクション内で順番にアクションが行われないことがあると記載がありますが
開くアクションより先に、カレントのAIDをローカルセルに保存が実行されてしまった場合、エラーになるという認識ですが、こちらは特に問題ないのでしょうか?
SQLを使う方法で、テーブルロックをして排他する必要まで考える必要はないとのことで、よかったです。
どうぞ、よろしくお願いいたします。
そうですね、AIDを自動カウントアップするCELF機能は知らないのですが、一つのアイデアとして・・・
①AID管理テーブルを用意します(列はAID、カレントのAIDを登録しておく)
②AID管理シートを新規作成し、その中にアクションセット(仮にカレントAID取得)を作成します
③アクションセット内で、「データ更新を一括実行する」アクションを配置し、その中で以下記述します
・AID管理テーブルを開く
・カレントのAIDをローカルセルに保存
・AIDを+1して更新登録
あとは更新系のアプリ側で、AID管理シートのカレントAID取得アクションを実行することで
AID管理シートに保存されているユニークなAIDを取り出せます。(取り出し例:=AID管理シート!A1)
>Yexiongmaoさん
まったくカブってますね、申し訳ないです。
今気づいたのですが補足として投稿させてくださいませ。
別のユーザがアクセスした場合すでに更新された最新のAIDという事になります。
同時にアクセスして更新がぶつかる可能性はほとんどないと思います。
取得した状態から登録されなかった場合に欠番にしてよいかという問題はありますが、必要に応じて対処は可能です。
また、コントロールマスタにコントロールの種類、年度、月度、ID、ユーザID、ステータスなどの項目をもたせ、アプリによって必要なレコードにアクセスするようにしておくと、何かにつけて便利に使用できると思います。