- PR -

排他制御について

1
投稿者投稿内容
MASA0306
会議室デビュー日: 2008/10/27
投稿数: 9
投稿日時: 2008-10-27 11:06
お世話になります。
ご意見を頂きたく投稿しました。

現在、あるバッチ機能をOSのスケジューラにて起動するプログラムを作成しております。
バッチプログラムは複数サーバにて起動されます。

そこで排他制御をどのように行おうか悩み中です。。
処理の大まかな流れを書きます。

1.DBからデータを抽出
2.バッチ処理対象かどうかをチェックする
3.バッチ処理対象の場合は、処理続行

要件として、負荷軽減のためにチェックしたデータについてはDBの項目にフラグを設けて
1で検索させないようにします。

同時に実行された場合、2と3の処理で排他制御が必要なのですがどのようにすれば
効率が良いでしょうか。
現在考えているのは、ロックテーブルのようなものを作成して対処しようか検討中です。

よろしくお願い致します。
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-10-27 12:18
複数のコンピュータ間の排他制御をおこなうのであればデータベースのリソースを使用して排他制御をおこなうのは妥当な判断だと思います。

データベースは何なんでしょうか? SQL Server であれば、ロック管理用テーブルを作成しなくても、sp_getapplock/sp_releaseapplock ストアドプロシージャを使用することで、複数コンピュータ間の排他制御を実現することができます。

もしも、ロック管理テーブルを自作するのであれば、ロック管理テーブルを COMMIT せずに使うのが有効です。COMMIT しないことで、アプリケーション異常終了時にロックが残ってしまうことがなくなります。
無名tiger
常連さん
会議室デビュー日: 2008/04/18
投稿数: 36
投稿日時: 2008-10-27 13:18
引用:

未記入さんの書き込み (2008-10-27 12:18) より:
...



未記入さんの意見賛成します。

個人的には基本的にはデータベースの機能を使ったほうがいいと思います。
自分でロックテーブル作成、ロックの仕組みを作るには手間かかると不具合発生しやすい問題があります。

個人の考え方
1)一つのストアドプロシージャで処理する
2)処理の間、他セッションは同じデータ更新できませんので、排他処理仕組み作る必要がない。
3)必要があれば SELECT 〜 FOR UPDATE などを使ってロックする。(Oracleの場合)

_________________
カスタマイズ自由自在のスタートページ。
MASA0306
会議室デビュー日: 2008/10/27
投稿数: 9
投稿日時: 2008-10-27 15:14

返信有難うございます。

>データベースは何なんでしょうか? SQL Server であれば、ロック管理用テーブルを作成しなくても、sp_getapplock/sp_releaseapplock ストアドプロシージャを使用することで、複数コンピュータ間の排他制御を実現することができます。

DBは、oracle10gを使用しています。

>もしも、ロック管理テーブルを自作するのであれば、ロック管理テーブルを COMMIT せずに使うのが有効です。COMMIT しないことで、アプリケーション異常終了時にロックが残ってしまうことがなくなります。

参考になりました!

>SELECT 〜 FOR UPDATE などを使ってロックする。(Oracleの場合)

こちらも考えたのですが、対象レコードが大量になる恐れがあるため断念しました。。
1

スキルアップ/キャリアアップ(JOB@IT)