NSDNの参考サイト はこちら
Access(データベース)でのトランザクションの概念は上記MSDNの参考サイトのコメントの通り、このままだと思う。
トランザクションとは、一連の操作を 1 つにまとめて、1 つの作業単位として処理する概念です。トランザクションを構成する処理はその全体が完了する必要があり、トランザクションの一部が失敗するとトランザクション全体が失敗となります。開発者はトランザクションを使用することで、処理に際してのデータ整合性を保証することができます。複数のデータベース操作を、全体として成功または失敗しなければならない 1 つの単位にまとめることにより、データベースが矛盾した状態に陥ることがなくなります。トランザクションの概念はほとんどのデータベース管理システムで広く利用されています。
トランザクション処理の最も一般的な例は、銀行の現金自動預払機 (ATM) です。現金を支払い、利用者の口座残高から支払額を差し引く一連のプロセスは、1 つの論理的な作業単位であると見なされ、トランザクションとしてラップされます。システムが支払額を口座残高から差し引くことができない限り、現金は支払われません。トランザクションを使用することにより、操作全体が成功するか失敗するかのどちらかになります。これにより、ATM データベースの一貫した状態が維持されます。
すべての操作をコミットする前に、1 つの処理単位を構成するすべての操作が成功することを保証する必要がある場合は、トランザクションを使用することをお勧めします。すべてのトランザクションは他のトランザクションに対して不可視であることに留意してください。すなわち、トランザクションがコミットされるまで、どのトランザクションも別のトランザクションによるデータベースの更新について関知することはできません。
wikipedia ではこちらで、処理の最少単位、アトミック性、などともいう。
プログラマ的な言葉(概念)だと排他制御イメージしやすいと思われる。
クリティカルセクション とか セマフォ とか ミューテックス とか
この処理を実行中には、他の処理が絶対に触ってほしくない変数やデータクラスを触らせない工夫、あくまでの概念
ここを踏まえて、Accessでのトランザクションの実装
MSDNのサンプルでポイント部分にコメントを付記。
Sub ChangeTitle()
Dim wrkCurrent As DAO.Workspace
Dim dbsNorthwind As DAO.Database
Dim rstEmployee As DAO.RecordsetOn Error GoTo ErrorHandler
Set wrkCurrent = DBEngine.Workspaces(0)
Set dbsNorthwind = CurrentDB
Set rstEmployee = dbsNorthwind.OpenRecordset("Employees")‘トランザクションの開始
wrkCurrent.BeginTrans
‘ここから、処理の終了(CommitTrans(すべての変更を保存) or Rollback(すべての変更をキャンセル)
‘までがいわゆるトランザクション
Do Until rstEmployee.EOF
If rstEmployee!Title = "Sales Representative" Then
rstEmployee.Edit
rstEmloyee!Title = "Sales Associate"
rstEmployee.Update
End If
rstEmployee.MoveNext
Loop‘ここでは、メッセージボックスでユーザーに
‘処理の終了を判断させている。
‘CommitTrans(すべての変更を保存) or Rollback(すべての変更をキャンセル)
If MsgBox("Save all changes?", vbQuestion + vbYesNo) = vbYes Then
wrkCurrent.CommitTrans
Else
wrkCurrent.Rollback
End If
‘ここまでが、いわゆるトランザクションrstEmployee.Close
dbsNorthwind.Close
wrkCurrent.CloseSet rstEmployee = nothing
Set dbsNorthwind = Nothing
Set wrkCurrent = NothingExit Sub
ErrorHandler:
MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description
End Sub
このサンプルでは、 ‘CommitTrans(すべての変更を保存) or Rollback(すべての変更をキャンセル)をユーザーに選択させているが、そのほかの使い方として考えられるのは、
① 関数(サブルーチン)の最初でBeginTrans
① 一連の処理の中で正常終了とさせる最後にCommitTrans、
② 何等かのエラーが発生した時(エラーイベントを受けた時(サンプルコードでは ErrorHandler:)に、後処理としてRollback
とすることもある。
コメント