DAO レコードセットでトランザクションを使用する

トランザクションとは、一連の操作を 1 つにまとめて、1 つの作業単位として処理する概念です。 トランザクションを構成する処理はその全体が完了する必要があり、トランザクションの一部が失敗するとトランザクション全体が失敗となります。 開発者はトランザクションを使用することで、処理に際してのデータ整合性を保証することができます。 複数のデータベース操作を、全体として成功または失敗しなければならない 1 つの単位にまとめることにより、データベースが矛盾した状態に陥ることがなくなります。 トランザクションの概念はほとんどのデータベース管理システムで広く利用されています。

トランザクション処理の最も一般的な例は、銀行の自動テラー マシン (ATM) です。 現金を分配してからユーザーの口座を引き落とすプロセスは、作業の論理単位と見なされ、トランザクションにラップされます。システムが口座を引き落とすことができる場合を除き、現金は分配されません。 トランザクションを使用すると、操作全体が成功または失敗します。 これにより、ATM データベースの一貫性のある状態が維持されます。

すべての操作をコミットする前に、1 つの処理単位を構成するすべての操作が成功することを保証する必要がある場合は、トランザクションを使用することをお勧めします。 すべてのトランザクションは他のトランザクションに対して不可視であることに留意してください。 すなわち、トランザクションがコミットされるまで、どのトランザクションも別のトランザクションによるデータベースの更新について関知することはできません。

注:

Access データベースでのトランザクションの動作は、SQL Server などの ODBC データ ソースの動作と異なります。 たとえば、データベースがファイル サーバーに接続されており、トランザクションがその変更のコミットを完了する前にファイル サーバーが停止した場合、データベースは矛盾した状態のままとなる可能性があります。 持続性の観点から高信頼性のトランザクション サポートが必要な場合は、クライアント/サーバー アーキテクチャの利用を検討してください。

Access データベース エンジンは、Workspace オブジェクトの DAO BeginTransCommitTrans、Rollback メソッドを使用したトランザクションをサポートします。

次のコード例では、[社員] テーブル内のすべての営業担当者の役職を変更します。 BeginTrans メソッドで、[社員] テーブルに対するすべての変更を分離するトランザクションを開始した後、CommitTrans メソッドで変更を保存します。 Rollback メソッドを使用すると、 Update メソッドで保存した変更を変更前の状態に戻すことができます。

Sub ChangeTitle() 
 
Dim wrkCurrent As DAO.Workspace 
Dim dbsNorthwind As DAO.Database 
Dim rstEmployee As DAO.Recordset 
 
On Error GoTo ErrorHandler 
 
   Set wrkCurrent = DBEngine.Workspaces(0) 
   Set dbsNorthwind = CurrentDB 
   Set rstEmployee = dbsNorthwind.OpenRecordset("Employees") 
 
   wrkCurrent.BeginTrans 
   Do Until rstEmployee.EOF 
      If rstEmployee!Title = "Sales Representative" Then 
         rstEmployee.Edit 
         rstEmployee!Title = "Sales Associate" 
         rstEmployee.Update 
      End If 
      rstEmployee.MoveNext 
   Loop 
 
   If MsgBox("Save all changes?", vbQuestion + vbYesNo) = vbYes Then 
      wrkCurrent.CommitTrans 
   Else 
      wrkCurrent.Rollback 
   End If 
 
   rstEmployee.Close 
   dbsNorthwind.Close 
   wrkCurrent.Close 
 
   Set rstEmployee = nothing 
   Set dbsNorthwind = Nothing 
   Set wrkCurrent = Nothing 
 
   Exit Sub 
 
ErrorHandler: 
   MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description 
End Sub

トランザクションを使用すると、指定した Workspace オブジェクト内のすべてのデータベースと Recordset オブジェクトが影響を受けます。トランザクションは、特定のデータベースまたは Recordset ではなく、ワークスペースに対してグローバルです。 複数のデータベースまたはワークスペース トランザクション内で操作を実行する場合、 Commit メソッドと Rollback メソッドは、トランザクション中にそのワークスペース内で変更されたすべてのオブジェクトに影響します。

BeginTransCommitTransRollback の各メソッドを DBEngine オブジェクトと共に使用することもできます。 この場合、トランザクションは既定のワークスペースである DBEngine.Workspaces(0) に対して適用されます。

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。