Access VBAで業務システムを開発していると、
- 複数テーブルを同時更新したい
- 更新途中でエラーになった
- データ不整合を防ぎたい
- 在庫更新と履歴登録を同時に行いたい
- 絶対に中途半端な更新を許したくない
という場面が発生します。
重要な更新処理ではDAOのトランザクション処理を利用するべきです。
トランザクションを利用すると、
全て成功
↓
更新確定
途中で失敗
↓
全て元に戻す
ことができます。
業務システムでは必須レベルの技術です。
- トランザクションとは
- トランザクションを利用すると
- DAOのトランザクション命令
- 基本構文
- 逆引き① 更新成功時に確定したい
- 逆引き② エラー時に取消したい
- 逆引き③ 複数テーブル更新したい
- 逆引き④ DAO Recordset更新をまとめたい
- 逆引き⑤ 更新件数を確認したい
- 実務活用例① 受注登録システム
- 実務活用例② CSV取込システム
- 実務活用例③ 設備管理システム
- 実務活用例④ 売上管理システム
- 実務活用例⑤ ログ管理
- 実務で最も多いパターン
- トランザクションを使わない危険性
- CommitTransのタイミング
- Rollbackの威力
- DAOトランザクション利用時の注意点
- DAOトランザクションが必須な処理
- 開発現場での利用頻度
- まとめ
トランザクションとは
例えば受注処理を考えます。
更新対象
T_ORDER
T_STOCK
T_HISTORY
実行内容
受注登録
↓
在庫減算
↓
履歴登録
もし途中でエラーになると
受注登録済
在庫更新失敗
履歴未登録
になります。
問題
データ不整合
が発生します。
トランザクションを利用すると
受注登録
↓
在庫更新
↓
履歴登録
↓
成功
↓
Commit
失敗時
受注登録
↓
在庫更新
↓
エラー
↓
Rollback
↓
全取消
となります。
DAOのトランザクション命令
主に使用するのは3つです。
BeginTrans
開始
DBEngine.BeginTrans
CommitTrans
確定
DBEngine.CommitTrans
Rollback
取消
DBEngine.Rollback
基本構文
On Error GoTo ErrHandler
DBEngine.BeginTrans
'更新処理
DBEngine.CommitTrans
Exit Sub
ErrHandler:
DBEngine.Rollback
これが基本形です。
逆引き① 更新成功時に確定したい
最も基本的なパターンです。
DBEngine.BeginTrans
CurrentDb.Execute "UPDATE T_STOCK " & "SET 数量 = 数量 - 1"
DBEngine.CommitTrans
結果
更新確定
になります。
逆引き② エラー時に取消したい
実務では必須です。
On Error GoTo ErrHandler
DBEngine.BeginTrans
CurrentDb.Execute strSQL1
CurrentDb.Execute strSQL2
DBEngine.CommitTrans
Exit Sub
ErrHandler:
DBEngine.Rollback
効果
途中失敗なら全取消です。
逆引き③ 複数テーブル更新したい
代表例です。
DBEngine.BeginTrans
CurrentDb.Execute strOrderSQL
CurrentDb.Execute strStockSQL
CurrentDb.Execute strHistorySQL
DBEngine.CommitTrans
効果
一括更新
になります。
逆引き④ DAO Recordset更新をまとめたい
Recordsetも対象です。
DBEngine.BeginTrans
rs.Edit
rs!数量 = 100
rs.Update
DBEngine.CommitTrans
逆引き⑤ 更新件数を確認したい
更新チェックです。
CurrentDb.Execute strSQL
件数取得
Debug.Print CurrentDb.RecordsAffected
失敗判定に利用できます。
実務活用例① 受注登録システム
受注処理です。
処理
受注登録
↓
在庫減算
↓
履歴登録
コード
DBEngine.BeginTrans
CurrentDb.Execute strOrderSQL
CurrentDb.Execute strStockSQL
CurrentDb.Execute strHistorySQL
DBEngine.CommitTrans
メリット
整合性保証
実務活用例② CSV取込システム
大量取込です。
処理
CSV取込
↓
エラーチェック
↓
登録
エラー発生
全取消
“
できます。
コード
DBEngine.BeginTrans
'登録処理
DBEngine.CommitTrans
実務活用例③ 設備管理システム
設備状態変更です。
更新対象
設備マスタ
履歴テーブル
同時更新を保証できます。
実務活用例④ 売上管理システム
売上確定処理です。
更新
売上
売掛
履歴
同時更新が必要です。
実務活用例⑤ ログ管理
バッチ処理です。
例
処理結果
ログ登録
整合性を維持できます。
実務で最も多いパターン
ベテラン開発者がよく使う形です。
On Error GoTo ErrHandler
DBEngine.BeginTrans
CurrentDb.Execute strSQL1
CurrentDb.Execute strSQL2
CurrentDb.Execute strSQL3
DBEngine.CommitTrans
MsgBox "完了"
Exit Sub
ErrHandler:
DBEngine.Rollback
MsgBox Err.Number & vbCrLf & Err.Description
非常によく見かけます。
トランザクションを使わない危険性
例えば
CurrentDb.Execute strSQL1
CurrentDb.Execute strSQL2
途中で失敗すると
SQL1成功
SQL2失敗
になります。
結果
データ不整合
が発生します。
CommitTransのタイミング
重要です。
悪い例
Execute
Commit
Execute
良い例
全更新終了
↓
Commit
途中では確定しません。
Rollbackの威力
例えば
10回更新
↓
9回成功
↓
10回目失敗
Rollbackすると
全て元に戻る
のが最大の特徴です。
Copilot活用術①
Access VBAです。
DAOトランザクションを利用して
受注登録と在庫更新を
同時実行するコードを
作成してください。
Copilot活用術②
以下のDAOコードへ
Rollback処理を
追加してください。
Copilot活用術③
以下の更新処理に
トランザクションが必要か
レビューしてください。
DAOトランザクション利用時の注意点
Commit忘れ
忘れると更新確定されません。
Rollback忘れ
エラー発生時に危険です。
長時間処理に注意
大量更新ではテーブルロックが長くなります。
BeginTransの範囲を最小化
必要な処理だけ囲みます。
DAOトランザクションが必須な処理
特に重要なのは次の処理です。
- 受注登録
- 売上確定
- 在庫更新
- 入出庫管理
- CSV一括取込
- データ移行
- バッチ処理
開発現場での利用頻度
| 順位 | 用途 |
|---|---|
| 1位 | 受注登録 |
| 2位 | 在庫更新 |
| 3位 | CSV取込 |
| 4位 | バッチ処理 |
| 5位 | データ移行 |
業務システムでは非常に重要です。
まとめ
DAOのトランザクション処理は、Access VBA開発においてデータ整合性を守るための最重要技術の一つです。
特に
- 受注登録
- 売上管理
- 在庫管理
- CSV取込
- データ移行
などで大きな効果を発揮します。
重要なのは次の3つです。
DBEngine.BeginTrans
DBEngine.CommitTrans
DBEngine.Rollback
これらを正しく利用することで、
中途半端な更新を防ぐ
データ不整合を防ぐ
運用品質を向上する
ことができます。
Copilotを活用すれば、
- トランザクションコード生成
- Rollback追加
- エラーハンドリング強化
も効率的に進められます。
Access VBAで本格的な業務システムを開発するなら、DAOトランザクションは必ず習得しておきたい技術です。

コメント