【Access VBA】トランザクション処理の正しい使い方と注意点

Accessでは、複数のデータ操作をまとめて実行し不整合を防ぐ「トランザクション処理」という機能があります。
本記事ではAccess VBAでのトランザクション処理の正しい使い方と注意点をわかりやすく解説します。
- トランザクション処理の仕組みと考え方
- トランザクション処理の基本的な書き方
- 実務で使える具体的なサンプルコード
- トランザクション処理の注意点
トランザクション処理とは
トランザクション処理とは、関連する複数の操作を一つの不可分な処理単位としてまとめ、
すべて成功するか、すべて失敗して元の状態に戻す仕組みのことです。
「なんか難しそう…」って感じますよね。
一言で言うと「まとめて実行して、途中で失敗したら元に戻す仕組み」です。
トランザクション処理のメリット
トランザクション処理が使われる主な理由は次の通りです。
- データの不整合を防げる
- エラー発生時の安全性が高い
- 業務処理をまとめて管理できる
- 保守・管理がしやすくなる
トランザクション処理はシステムを使う人にも作る人にもメリットがあります。
そのため、現在の多くのシステムで積極的に活用されています。
トランザクション処理の使い方
トランザクション処理について理解したところで、実際にAccessでどのように使うのかを見ていきましょう。
基本的な使い方
Accessのトランザクション処理では主に次の3つの機能を使います。
| 機能 | 内容 |
|---|---|
| BeginTrans | トランザクションを開始する |
| CommitTrans | トランザクションを確定し処理結果を反映する |
| RollbackTrans | エラー発生時に処理を中止し元の状態に戻す |

それぞれの機能を順番に詳しく見ていきましょう。
BeginTrans(トランザクション開始)
BeginTransはトランザクション処理を開始する命令です。
この命令を実行した時点から複数のデータ操作をまとめて扱えるようになります。
例えば、複数のレコードを追加・更新する処理をまとめて行う場合、
途中でエラーが起きても元に戻せるようにします。
Dim db As DAO.Database
Set db = CurrentDb
' トランザクション開始
db.BeginTrans
' ここから複数の操作をまとめて実行
db.Execute "INSERT INTO T001_社員 (社員ID, 名前) VALUES (1, '山田太郎')"
db.Execute "INSERT INTO T001_社員 (社員ID, 名前) VALUES (2, '佐藤花子')"次のステップでは、CommitTrans や RollbackTrans を使ってこの処理を確定または元に戻す方法を見ていきます。
CommitTrans(トランザクション確定)
CommitTransはトランザクション内で行ったすべての処理を確定し、データベースに反映させる命令です。
処理がすべて正常に完了した場合に実行します。
Dim db As DAO.Database
Set db = CurrentDb
db.BeginTrans
On Error GoTo ErrHandler
db.Execute "INSERT INTO T001_社員 (社員ID, 名前) VALUES (1, '山田太郎')"
db.Execute "INSERT INTO T001_社員 (社員ID, 名前) VALUES (2, '佐藤花子')"
' すべて成功したら確定
db.CommitTrans
MsgBox "登録が完了しました。"
Exit Sub
ErrHandler:
MsgBox "エラーが発生しました。"
db.RollbackTransこのように、すべての処理が成功した場合のみCommitTransを実行することで、
途中でエラーが起きた場合に不完全なデータが残るのを防げます。
RollbackTrans(トランザクション中止)
RollbackTrans は、トランザクション内で行ったすべての処理を取り消し、元の状態に戻す命令です。
主にエラーが発生した場合に実行します。
Dim db As DAO.Database
Set db = CurrentDb
db.BeginTrans
On Error GoTo ErrHandler
db.Execute "INSERT INTO T001_社員 (社員ID, 名前) VALUES (1, '山田太郎')"
db.Execute "INSERT INTO T001_社員 (社員ID, 名前) VALUES (1, '佐藤花子')" ' 重複エラー想定
db.CommitTrans
MsgBox "登録が完了しました。"
Exit Sub
ErrHandler:
db.RollbackTrans
MsgBox "エラーが発生したため、処理をすべて取り消しました。"この例では、2件目のINSERTでエラーが発生すると1件目の登録も含めてすべて元に戻ります。
トランザクション処理のポイント
「途中まで成功してしまう」という最悪の状態を防げる
トランザクション処理の基本構文まとめ
db.BeginTrans
On Error GoTo ErrHandler
' 処理
db.CommitTrans
Exit Sub
ErrHandler:
db.RollbackTransまずはこの基本構文をそのままテンプレートとして覚えるのがおすすめです。
実務ではこの形にSQL処理を挟むだけで安全なデータ更新処理を簡単に実装できます。
トランザクション処理を使う際の注意点
トランザクション処理は非常に便利ですが注意すべき点もあります。
トランザクション処理の終了忘れ
トランザクション処理を開始した場合
CommitTransまたはRollbackTransを実行しないとデータが確定されず、
意図しない不整合が発生する可能性があります。
必ず正常終了時はCommit、異常終了時はRollbackという構造を守りましょう。
エラーハンドリングを実装する
エラー処理を入れずにトランザクションを使うと、
途中でエラーが発生した場合にデータの整合性が崩れる恐れがあります。
On Error GoTo ErrHandlerを使いRollbackを実行できる構成にしてください。
トランザクション処理を使いすぎない
トランザクション処理は非常に便利ですが、すべての処理に使えばよいというわけではありません。
処理内容によっては、トランザクションを使わなくても安全に実行できます。
例えば、次のような データを取得するだけの処理 にはトランザクション処理は不要です。
SELECT * FROM T顧客;これは顧客テーブルからすべてのデータを取得するだけのSQLです。
データの登録・更新・削除を行わないため、処理に失敗してもデータの不整合は発生しません。
このように参照系(SELECT)のみの処理では、原則としてトランザクションは不要です。
むやみにトランザクションを使用すると、ロック競合やパフォーマンス低下の原因になるため注意しましょう。
まとめ
今回はAccess VBAにおけるトランザクション処理の正しい使い方と注意点を解説しました。
正しく実装することで、エラー発生時のデータ不整合を防ぎ、安全にシステムを運用できます。
特に、複数テーブルの登録・更新・削除処理では積極的に活用していきましょう。
コメント