Access VBAの極意:DAO.Recordsetの「LockEdits」で排他制御を支配する
Access開発において、多くの人が「なんとなく」で済ませてしまい、のちのち地獄を見るのが「レコードの排他制御」です。
複数人が同じテーブルを操作する現場で、「更新が競合しました」「書き込みができません」というエラーに頭を悩ませたことはありませんか?今日は、DAO.Recordsetが持つ強力な武器、`LockEdits`プロパティを使いこなし、「安全で、かつ高速なシステム」を作るための極限の知見を授けます。
—
1. なぜ「排他制御」が必要なのか?(イメージ図)
想像してください。二人の事務員AさんとBさんが、同時に同じ「顧客データ」を開き、同時に修正しようとしたらどうなるでしょう?
- Aさんの世界: 「よし、電話番号を変えよう」
- Bさんの世界: 「よし、住所を変えよう」
二人が同時に保存ボタンを押したとき、Accessはパニックになります。「どっちの変更を優先すればいいんだ?」と。この混沌を防ぐための「交通整理」が排他制御です。
悲観的排他制御(Pessimistic Locking)とは
「誰かが編集している間、他の人は一切手出し無用!」という、非常に堅実な制御です。これをAccess VBAで司るのが `LockEdits` プロパティです。
—
2. LockEditsを使いこなす:コードの作法
`DAO.Recordset`を作成する際、デフォルトでは「楽観的排他制御」が働きますが、現場の要件に応じてこれを切り替える必要があります。
実践:悲観的排他制御のコード例
Public Sub UpdateCustomerData(customerID As Long)
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
‘ レコードセットを開く際、dbOpenDynaset を指定するのが定石
‘ dbPessimistic を指定することで「悲観的排他制御」を明示する
Set rs = db.OpenRecordset(“SELECT FROM T_Customers WHERE ID = ” & customerID, _
dbOpenDynaset, dbPessimistic)
‘ ここで LockEdits を明示的に True に設定(これが悲観的排他制御のスイッチ)
rs.LockEdits = True
If Not rs.EOF Then
rs.Edit ‘ この瞬間、他者はこのレコードを編集できなくなる(ロック!)
rs!PhoneNumber = “090-xxxx-xxxx”
rs.Update ‘ 書き込み完了と同時にロック解除
End If
‘ 後始末はエンジニアの嗜み
rs.Close
Set rs = Nothing
Set db = Nothing
End Sub
コードの解説
1. `dbPessimistic`: OpenRecordsetの引数で「悲観的モード」を宣言します。
2. `rs.LockEdits = True`: `Edit`メソッドを実行した瞬間にレコードを物理的にロックします。これにより、他ユーザーが同じレコードを編集しようとしても、編集モードに入ることができません。
3. `rs.Update`: このメソッドが呼ばれるまでロックは保持されます。
—
3. 初学者が陥りやすい「落とし穴」
その1:ロック時間を長くしすぎる
`rs.Edit`してから`rs.Update`するまでの間、そのレコードは「凍結」されます。もしその間に「ユーザーへのメッセージボックス表示」や「重い計算処理」を挟むと、システム全体が停滞します。ロックの範囲は極限まで短くするのがプロの鉄則です。
その2:エラーハンドリングの欠如
もし誰かが既にロックしているレコードに触れようとしたら、VBAは無慈悲にエラーを吐いて停止します。必ず `On Error GoTo` で制御しましょう。
On Error GoTo ErrorHandler
‘ …(編集処理)…
Exit Sub
ErrorHandler:
If Err.Number = 3260 Then
MsgBox “現在、他の方がこのレコードを編集しています。後でもう一度試してください。”, vbExclamation
Else
MsgBox “予期せぬエラー: ” & Err.Description
End If
—
4. 伝説のエンジニアからのアドバイス
「Accessは遅い」と嘆く人の多くは、データベースの設計ではなく、この排他制御の設計を怠っています。
- 小規模なデータ: 楽観的排他制御(デフォルトのまま)で十分です。
- 重要度の高い会計データなど: 今回紹介した `LockEdits = True` による悲観的排他制御が必須です。
「とりあえず動く」コードから、「堅牢で誰もが安心して使える」コードへ。今日学んだ `LockEdits` の制御は、あなたが中級者から上級者へとステップアップするための確かな鍵となります。
まずは自分の書いているコードを見直し、`OpenRecordset`のオプションに意識を向けてみてください。そこから、あなたのAccess VBAライフが劇的に変わるはずです。
さあ、現場へ戻って、最強のコードを書き上げましょう!
