トランザクションとは、一連の操作を 1 つにまとめて、1 つの作業単位として処理する概念です。 トランザクションを構成する処理はその全体が完了する必要があり、トランザクションの一部が失敗するとトランザクション全体が失敗となります。 開発者はトランザクションを使用することで、処理に際してのデータ整合性を保証することができます。 複数のデータベース操作を、全体として成功または失敗しなければならない 1 つの単位にまとめることにより、データベースが矛盾した状態に陥ることがなくなります。 トランザクションの概念はほとんどのデータベース管理システムで広く利用されています。
トランザクション処理の最も一般的な例は、銀行の自動テラー マシン (ATM) です。 現金を分配してからユーザーの口座を引き落とすプロセスは、作業の論理単位と見なされ、トランザクションにラップされます。システムが口座を引き落とすことができる場合を除き、現金は分配されません。 トランザクションを使用すると、操作全体が成功または失敗します。 これにより、ATM データベースの一貫性のある状態が維持されます。
すべての操作をコミットする前に、1 つの処理単位を構成するすべての操作が成功することを保証する必要がある場合は、トランザクションを使用することをお勧めします。 すべてのトランザクションは他のトランザクションに対して不可視であることに留意してください。 すなわち、トランザクションがコミットされるまで、どのトランザクションも別のトランザクションによるデータベースの更新について関知することはできません。
注:
Access データベースでのトランザクションの動作は、SQL Server などの ODBC データ ソースの動作と異なります。 たとえば、データベースがファイル サーバーに接続されており、トランザクションがその変更のコミットを完了する前にファイル サーバーが停止した場合、データベースは矛盾した状態のままとなる可能性があります。 持続性の観点から高信頼性のトランザクション サポートが必要な場合は、クライアント/サーバー アーキテクチャの利用を検討してください。
Access データベース エンジンは、Workspace オブジェクトの DAO BeginTrans、CommitTrans、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 メソッドは、トランザクション中にそのワークスペース内で変更されたすべてのオブジェクトに影響します。
BeginTrans、CommitTrans、Rollback の各メソッドを DBEngine オブジェクトと共に使用することもできます。 この場合、トランザクションは既定のワークスペースである DBEngine.Workspaces(0)
に対して適用されます。
サポートとフィードバック
Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。