ACCESS トランザクション処理でデータの不整合を回避する(VBAコード公開)

トランザクション処理でデータの不整合を回避する

ACCESS VBAで処理をする際、予期せぬエラーで処理が途中で止まってしまう可能性があります。

ADOを使ってテーブルのデータを更新していた場合、処理が途中で止まってしまうと、データの不整合が発生してしまうかもしれません。

ACCESSは複数のテーブルをつなぎ合わせるリレーショナルデータベースですので、テーブルのデータの不整合は致命的です。

そんな時には、トランザクション処理が有効です。

今回は、データの不整合を回避するトランザクション処理についてご紹介します。


こんにちは。
はこにわガジェット (@hakoniwagadget) です。

ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。

トランザクション処理とは

トランザクション処理とは、データベースに対する一連の作業を1つの処理にまとめたものです。

VBAでテーブルのデータを変更する際に、VBAのコード一行ずつで処理を行うのではなく、複数の処理をまとめて実行することが可能です。

複数のテーブルの値を連動して更新しなければいけない際に、片方のテーブルに対する変更処理が何らかの原因で実行できなかった場合、データベースの値に矛盾が発生する可能性があります。

こうした際にトランザクション処理を用いておけば、両方のテーブルが確実に更新できることを確認したうえで、テーブルの値の更新ができます。

トランザクション処理の方法

ACCESSのトランザクション処理は、主にテーブルのデータを追加・更新・削除する際に使用します。

そのため、ADO(ActiveX Data Object)でトランザクション処理を使用します。

以下に、サンプルコードを記載します。


Public Sub uriage_torikeshi(uriage_id As Long)
'■■■売上伝票削除時に売上明細も連動して削除■■■

'変数にADOオブジェクトを代入
Set cnn = CurrentProject.Connection
Set rst1 = New ADODB.Recordset
rst1.CursorLocation = adUseClient

'レコードセットを取得
rst1.Open "TRN_売上明細", cnn, adOpenKeyset, adLockOptimistic

'トランザクション処理開始
cnn.BeginTrans

rst1.Filter = "売上ID = " & uriage_id

'売上明細がない場合
If rst1.recordcount = 0 Then

    cnn.RollbackTrans

'売上明細がある場合
Else

    Do Until rst1.EOF
    
        rst1!削除 = "true"
        rst1.MoveNext
        
    Loop
    
    cnn.CommitTrans

End If

'終了処理
rst1.Close: Set rst1 = Nothing
cnn.Close: Set cnn = Nothing

End Sub

上記の処理は、売上伝票を削除した際に、売上伝票に含まれている売上明細を連動して削除処理するものです。

テーブルの値を更新する際に、トランザクション処理を行っています。

まず、トランザクションの開始は


cnn.BeginTrans

で行います。

これ以降の処理は、トランザクション処理を終了されるまでは実際にテーブルの値を更新されません。

そして、一連の処理が終わったところで、


cnn.CommitTrans

でトランザクション処理を終了し、実際のテーブルに更新を加えます。

一方で、エラールーチン等で処理を途中終了する際は、


cnn.RollbackTrans

でテーブルへの変更は加えずにトランザクション処理を終了します。

トランザクション処理は必須ではありませんが、ADOからテーブルのデータ更新を行う際は、念のため設定しておく方が良いでしょう。

ただし、データ処理を行うレコード数や処理回数が非常に多いプロシージャの場合は、トランザクション処理を行うことで動作が遅くなることもありますのでご注意ください。

以上、トランザクション処理でデータの不整合を回避するをご紹介しました。


ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。

そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。

ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。