Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
MDB検索更新異常時のロールバック方法
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30524#CommentId84119
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
2020/8/27 11:00:28
> 例えばDAOを利用したSQLでMDBを検索
> 更新したプログラムのHP、どこかに無いでしょうか?
幾つかありますよ。たとえば Access のヘルプにも記載がありますが、
それがCOBOLプログラマさんの求める物かは分かりません。
具体例が欲しければ、サンプルを書いても良いですが、そもそも開発環境は何でしょうか?
それによってもしかしたら、DAO を使うことが正しい選択ではない可能性もあります。
> <初心者です>先輩はまた違う訳ですね
ん? どういう意味でしょうか。
初心者ですさんの投稿は、このあたりでしたね。
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30486
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30486
> ロールバックは
> ADODB かDAOかSystem.Data.OleDbを使用しないといけ
> ないわけですね
そうですね。通常は先の回答のメソッドを使うのが一般的です。
ただ、他の選択肢もあります。SQL ステートメント(ANSI-92 モード)としての
トランザクション構文もあるので、メソッドの代わりに SQL からの指定も一応可能です。
https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/transaction-statement-microsoft-access-sql
トランザクションの指定が無かった場合は、自動コミットモードとなります。
正常時には即時反映され、失敗時にはロールバックされる状態ですね。
★この状態を、暗黙のトランザクション(implicit transaction) と言います。
ただ即時反映とはいいつつも、キャッシュの都合上、ファイルへの書き込みは
非同期的に行われる点に注意が必要です。実際にファイルに書き込まれるまでには、
最大で500ミリ秒の書き込み遅延が発生します。(レジストリ設定で変更可能)
暗黙のトランザクションで実装した場合、マルチユーザー環境においては、
新たに追加したレコードが、キャッシュがフラッシュされるまでの間、
他のユーザーから見えない状態になるなど、望ましくない結果を生んでしまいます。
そのため通常は、明示的に BeginTrans / Commit(CommitTrans) を呼んで
トランザクション範囲を明示するようにするのが安全です。マルチユーザーの場合はほぼ必須。
この場合、コミット時のファイルへの反映が同期的となり、上記の遅延問題が生じなくなります。
☆この状態を、明示的トランザクション(explicit transaction) と言います。
明示的トランザクションの場合、Commit(CommitTrans) メソッドを呼びだすまでは
ファイルへの書き込みは保留された状態となります。
実行時エラーになった場合には、もちろん処理結果は反映されません。
編集を諦めてそのままデータベースとの接続を閉じてしまっても良いですし、
あるいはロールバックして、正しい値で処理をやり直してみるのも良いでしょう。