[ VBA-Access ] DAO (Data Access Object) でトランザクション管理

Pocket

「 DAO レコードセットでトランザクションを使用する 」 によると、DAO を使って Access データベースのトランザクションの管理を行うことができるようですが、やはりアクセスはアクセスです。あまり無茶な使い方はしないようにしたほうが良さそうです。

 MSDN では、Office2013 以降で使用できるような雰囲気がありますが、どうなのでしょうか?

スポンサーリンク

DAO のトランザクション管理サンプル

本サンプルは上記リンク先のものです。リンク先で詳細は確認してください。

Dim wrkCurrent As DAO.Workspace
Dim dbsNorthwind As DAO.Database
Dim rstEmployee As DAO.Recordset

Set wrkCurrent = DBEngine.Workspaces(0)
Set dbsNorthwind = CurrentDB

' 従業員テーブルを読み込む
Set rstEmployee = dbsNorthwind.OpenRecordset("従業員")

wrkCurrent.BeginTrans ' トランザクション開始

' 全レコードを繰り返し処理する
Do Until rstEmployee.EOF

' タイトルカラムを変更
If rstEmployee!Title = "まゆゆのケツはワレテいない" Then
    rstEmployee.Edit
    rstEmloyee!Title = "衝撃:ワ、ワ、ワレテイタ"
    rstEmployee.Update
End If
rstEmployee.MoveNext
Loop

' 変更確認ダイアログを出力
If MsgBox("保存しますか?", 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

そうはいっても期待するトランザクション管理ではない

やはり、Access はローカルで単一アクセスや複数人であれば読み取り専用で使用することにしたほうがよさそうです。MSDN によると、

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

とありますので、サンプルコードの例では、変更確認ダイアログの出力中に強制終了した場合には、タイトルカラムの変更はロールバックせず、有効になっている可能性があるということのようです。アクセスでは、一旦レコードの変更を有効にしてしまい、ロールバックで取り消しを行うイメージなのでしょうか?

従って、今までもそうであるように、センシティブでクリティカルなシステムへの利用は向いていません。また、神経質な人にも向いていません。

要件的にアクセスで十分であってもデータベースは Oracle で、という人は個人的には嫌いです。そういう人、何人もいました。

スポンサーリンク

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>