Access VBAの暗黒面を照らす:DAOとADOのトランザクションと「ロックの哲学」
こんにちは。現場で「なぜか動かない」「なぜかデータが壊れる」という怪奇現象に頭を抱えた経験はありませんか?
Access開発において、多くの人がなんとなく使い分けている「DAO」と「ADO」。この二つのデータアクセス技術は、単なる「古いもの」と「新しいもの」ではありません。「トランザクション(一連の処理のひとまとめ)」を扱う際の挙動が根本的に異なる、別種の生物なのです。
今日は、マルチユーザー環境で最も恐ろしい「デッドロック」を回避し、堅牢なシステムを作るための「ロックの哲学」を解説します。ここを理解すれば、あなたはもう脱・マクロ初心者。真のアーキテクトへの第一歩です。
—
1. DAOとADO、その「トランザクション」の正体
そもそもトランザクションとは、「全部成功させるか、何もしなかったことにするか(ロールバック)」という神の権限です。
- DAO (Data Access Objects): Accessの心臓部。Accessデータベース(.accdb)の物理構造を熟知しており、「ページ単位」でロックをかけます。
- ADO (ActiveX Data Objects): 汎用的な窓口。SQL Serverなど外部DBとの親和性が高く、「行(レコード)単位」での制御が得意です。
この「ロック単位の違い」が、マルチユーザー環境での運命を分かちます。
—
2. 【実践】DAOのトランザクション(Accessネイティブの力)
DAOのトランザクションは、Accessのエンジン(ACE)と直結しているため、非常に軽量で高速です。しかし、一度書き込みを開始すると、関連するページ全体をロックする傾向があります。
Sub DaoTransactionExample()
Dim db As DAO.Database
Dim ws As DAO.Workspace
Set ws = DBEngine.Workspaces(0)
Set db = CurrentDb
‘ トランザクション開始
ws.BeginTrans
On Error GoTo RollbackHandler
‘ ここでデータを更新
db.Execute “UPDATE T_在庫 SET 在庫数 = 在庫数 – 1 WHERE 商品ID = 1”, dbFailOnError
‘ 確定させる
ws.CommitTrans
Exit Sub
RollbackHandler:
‘ 何か起きたら全部なかったことにする
ws.Rollback
MsgBox “エラー発生!変更を破棄しました。”
End Sub
ポイント: DAOは「Access専用機」としてチューニングされています。ローカルテーブルの更新ならDAO一択です。
—
3. 【実践】ADOのトランザクション(外部接続の要)
ADOは「接続」という概念が明確です。トランザクションの範囲もコネクションオブジェクトに依存します。
Sub AdoTransactionExample()
Dim conn As ADODB.Connection
Set conn = CurrentProject.Connection
‘ ADOは明示的にトランザクションを開始
conn.BeginTrans
On Error GoTo RollbackHandler
‘ SQLを実行
conn.Execute “UPDATE T_在庫 SET 在庫数 = 在庫数 – 1 WHERE 商品ID = 1”
‘ 確定
conn.CommitTrans
Exit Sub
RollbackHandler:
conn.RollbackTrans
End Sub
ポイント: ADOは「接続を切るまでロックが続く」という性質があります。長時間処理を放置すると、他のユーザーが何もできなくなる「デッドロック」の温床になります。
—
4. デッドロック回避の「黄金律」
マルチユーザー環境で「あ、また止まった…」とならないために、以下の3カ条を心に刻んでください。
1. トランザクションは短く保て!
- `BeginTrans` から `CommitTrans` の間で、ユーザーの入力を待つ(`MsgBox`を出すなど)のは厳禁です。処理は一瞬で終わらせてください。
2. 更新順序を統一せよ!
- AさんとBさんが同時に「テーブルA→テーブルB」の順で更新しようとするとデッドロックは起きにくいですが、「A→B」と「B→A」が交差すると地獄が始まります。全ての画面で更新順序を統一しましょう。
3. DAOとADOを混ぜるな!
- 同じトランザクション内でDAOとADOを混在させると、ロックの整合性が取れなくなり、予期せぬエラーの元になります。どちらかに統一するのがプロの作法です。
—
最後に:なぜ「重み」を知る必要があるのか
初学者のうちは「動けばいい」と考えがちです。しかし、Access VBAは「データ」という生き物を扱う仕事です。
DAOはAccessの「物理構造」を理解し、ADOは「データの流れ」を制御する。この道具の違いを理解したとき、あなたの書くコードは、単なる命令の羅列から、堅牢で美しい「システム」へと進化します。
まずはご自身の環境で、DAOを使った簡単な更新処理を書いてみてください。「なぜここでエラーが起きるのか?」と悩んだその瞬間こそが、あなたがエンジニアとして一段階上のステージに上がった証拠ですよ。
応援しています!何かあれば、いつでもこの場所に戻ってきてくださいね。
