「 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 で、という人は個人的には嫌いです。そういう人、何人もいました。