総合商社の Y 社は,労務管理に RDBMS を用いている。既存の勤怠管理機能に,新たに所在情報管理機能と監査機能を追加することになった。
〔RDBMS の排他制御〕
1.ロックは行単位で掛ける。 共有ロックを掛けている間、他のトランザクションから対象行への共有ロックは可能であり,専有ロックは共有ロックの解放待ちとなる。 専有ロックを掛けている間, 他のトランザクションから対象行への共有口ック及び専有ロックは,専有ロックの解放待ちとなる。
2.索引を使わずに表探索で全ての行に順次アクセスする場合, 検索条件に合致するか否かにかかわらず全行をロックの対象とする。 索引探索の場合, 索引から読み込んだ行だけをロックの対象とする。
〔所在情報管理機能の追加〕
1.機能の概要
オフィス内のフリーアドレス化を推進するため、従業員の就業エリア(以下,エリアという)への入退室のログを記録し,従業員の所在情報をエリア情報表示端末で社内に公開する。 エリア情報表示端末では,エリアの混雑状況なども表示する。
エリアには,建屋,フロア, 執務室があり,従業員は各エリアへの入退室時にIC カード社員証で認証を行う。 従業員は入退室時に必ず認証を行うように定められており,他の従業員に続いて認証せずに入退室することは禁止されている。 従業員は,建屋内にいる限りいずれかのエリアに所在しており,建屋から出ることで退出として扱われる。
所在情報管理機能では,認証時に入退室ログを記録する。 また、記録した入退室ログを基に,従業員の現在位置を示す所在情報及びエリアの混雑状況を定期的に更新する。
2.テーブル構造
主なテーブルのテーブル構造は、 図1のとおりである。 主キーには主索引が定義されている。
3.入退室ログ登録処理
従業員が入退室で認証する都度, “入退室ログ”テーブルに行を追加する。ログID は時系列に昇順で採番し,入退室区分には入室('T')又は退室 ('0') を設定する。必要に応じて,連携する勤怠管理機能及びエリア情報表示端末に情報を送信する。
処理の概要を図2に示す。 トランザクションの ISOLATION レベルは REPEATABLEREAD とする。
4.所在情報更新処理
5分ごとに実行するバッチ処理で、定期的にエリア状況及び所在情報を更新する。
“入退室ログ”テーブルに登録されている入退室ログを読み込み, “エリア状況”テーブルのエリアごとの在席者数を更新,“所在情報” テーブルの従業員ごとの最終入室エリアコードを更新する (退出している場合は,最終入室エリアコードには‘9999' を設定する)。 全ての更新が終わったら, 読み込み終わった入退室ログの位置を記録しておき, 次回実行時はその続きから読み込む。
所在情報更新処理の概要を図3, 所在情報更新処理に用いる SQL 文を表1に示す。トランザクションの ISOLATION レベルは REPEATABLE READ とする。
〔監査機能の追加〕
従業員の残業時間, 休暇, エリアを、入退室ログと突き合わせてチェックする監査機能を,要件に基づいて設計した。
1.監査機能の要件
(1) 監査対象月の1日から月末日までの勤怠をチェックする。 監査対象月の月末の営業日から翌月の5営業日までの間, 毎日実行する。
(2) 上長承認済み,かつ,監査未チェックの勤怠を対象にチェックする。 なお,一度監査が終了した行でも, 勤怠情報を従業員が更新した場合は, 上長承認と監査結果をリセットして、再度, 上長承認及び監査を行う。
(3) 監査機能のジョブは多重実行する。 全てのジョブに一意なジョブ ID を割り当て,それぞれのジョブに重複していない従業員番号の範囲を指定して実行する。また、処理の途中で失敗した場合, その原因を取り除いて, 同じジョブ ID で再実行することで, 処理を再開する。 なお, ジョブ ID は再利用する。
2.監査機能のテーブル設計
主なテーブルのテーブル構造は図4のとおりである。 主キーには主索引が定義されている。
“勤怠” テーブルには,従業員ごと年月日ごとの勤怠情報を記録する。 上長承認には, 承認済み ('Y') 又は未承認 ('N') を設定する。 監査結果には、監査未チェックの行は NULL を設定し, チェックしたら適正 ('Y') 又は不適正 ('N') を設定する。
監査機能のジョブが途中で失敗した場合に, ジョブを再実行するために “再開位置” テーブルを使用する。 再開従業員番号には処理中の従業員番号を記録し,再実行時には記録していた従業員番号から処理を再開する。
3.監査機能の処理設計
処理の流れと SQL文を図5に示す。 トランザクションの ISOLATION レベルは READCOMMITTED とする。
監査機能の実行時には他トランザクションも実行されており,排他ロック解放待ちタイムアウトの考慮も必要である。 排他ロック解放待ちタイムアウト時間を T秒とすると,他トランザクションで排他ロック解放待ちタイムアウトさせないための図 5中のN行を見積もる計算式は、次の式となる。
N < ( T - (A)に必要な時間 ) ÷ (B)に必要な時間