ソリューションでのトランザクションの使用方法
Microsoft Office 2000/Visual Basic プログラマーズ ガイド |
Microsoft Jet 4.0 providerで ADO を使用する際のトランザクションには、Connection オブジェクトの BeginTrans、CommitTrans、および RollbackTrans のメソッドを使用してください。基本的な構文は次の表の通りです。
メソッド | 操作 |
connection.BeginTrans | トランザクションを開始する |
connection.RollbackTrans | トランザクションを取り消す |
connection.CommitTrans | データベース オブジェクトにトランザクションを通知し、更新情報を記述する |
次に示す例では、Northwind データベースの Employee テーブルにある全セールス担当者の役職を変更します。BeginTrans メソッドで、Employee テーブルに加えたすべての変更を独立させるトランザクションを開始した後、CommitTrans メソッドを使用して変更を保存、または、Update メソッドを使用してトランザクション内で保存した変更を RollbackTrans メソッドで取り消します。
Sub ChangeTitle()
Dim cnn As ADODB.Connection
Dim strConnect As String
Dim strSQL As String
Const conFilePath As String = "C:\OPG\Samples" _
& "\CH05\Nwind.mdb"
' 接続文字列をフォーマットします。
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & conFilePath
' Connection オブジェクトを開きます。
Set cnn = New ADODB.Connection
cnn.Open strConnect
' SQL ステートメントをフォーマットしてレコードを更新します。
strSQL = "UPDATE Employees SET Title = " _
& "'Sales Associate' WHERE Title = 'Sales Representative'"
' トランザクションを開始します。
cnn.BeginTrans
' SQL ステートメントを実行します。
cnn.Execute strSQL
' ユーザーに変更を保存するかロールバックするかを促します。
' この処理はデモの目的で行われることに注意してください。
' 実際のソリューションでは、
' ユーザー入力が行われるまですべての
' 関連するレコードがロックされるため、
' ユーザー入力を待つような処理は避けるべきです。
If MsgBox("すべての変更を保存しますか ?", vbQuestion + vbYesNo) = vbYes Then
' トランザクションをコミットします。
cnn.CommitTrans
Else
' トランザクションをロールバックします。
cnn.RollbackTrans
End If
' Connection オブジェクトを閉じ、オブジェクト変数を破棄します。
cnn.Close
Set cnn = Nothing
End Sub
ChangeTitle プロシージャは、Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH16 サブフォルダに含まれる MultiuserDatabase.mdb サンプル ファイルの Transactions モジュールにあります。
メモ DAO では、トランザクションの適用範囲は Workspace オブジェクトにより決定されるため、トランザクションは、特定のデータベースまたはレコードではなく、ワークスペース全体にわたります。トランザクション中にその接続を使用し、DAO Workspace オブジェクトのトランザクション内のデータベースまたはレコード群に対して操作を行う場合、CommitTrans および RollbackTrans メソッドは変更された全オブジェクトに影響を与えます。ADO Connection オブジェクトでは一度に 1 つのデータベースしか開けないため、Access データベースでこのオブジェクトに対してトランザクションを使用する場合、この問題は関係ありません。Microsoft Transaction Server トランザクション プロセッサで ADO を使用している場合は、複数の Connection オブジェクトにわたるトランザクションを作成できますが、Microsoft Jet 4.0 OLE DB Provider ではこの機能はサポートされていません。
マルチユーザー環境で、一般的に使用されるもう 1 つのトランザクションは、変更中の共有データを不完全な状態で表示しないようにするものです。たとえば、ソリューションでデータを更新するコードを実行し、ほかのユーザーがそのデータ上で同時にレポートを実行しているとします。更新をトランザクションに含めていない場合、そのコードにより更新されたレコードと更新されていないレコードが混在すると、レポートを実行しているユーザーは矛盾したデータを受け取ることになります。更新をトランザクションに含めると、すべてのレコードが一度に更新されるため、ユーザーが矛盾したデータを受け取ることはありません。
トランザクションを必要以上に長時間にわたって開くことは避けてください。トランザクションでの編集によるすべてのロックは、トランザクションが完了するまで、または取り消すまで維持され、ロックにより、マルチユーザー ソリューションの同時実行が減少します。トランザクションで多くのレコードを処理する場合は、操作全体を分割してください。