- ベストアンサー
トランザクション
データベースのトランザクションで Aというデータがあるとき begin から始まって end で終了ですが その間に read(A) write(A:A*100) という処理を行ったとき 実際にA*100が書き込まれるのは end したときなのか write したときなのか どちらですか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>実際にA*100が書き込まれるのは >end >したときなのか >write >したときなのか 書き込むタイミングは、RDBによって変わります。 通常は、書き込むタイミングは問題になりません。 いつの時点を持って、確定されるかが大事だと思いますよ。 例えば、物理的にディスクの更新が未処理でも、コミット済みの更新は、 他のトランザクションに更新後の状態が参照可能なRDBがあります。 逆に、物理的にディスクを更新済みでも、コミットしていない場合は、 他のトランザクションには、更新前のデータを見せる仕組みのRDBが あります。これは、最終的にコミットしなければ、RDB自身がロールバックを 保証する仕組みになります。 ユーザから見ると、物理更新のタイミングは、実装上の問題であって、 トランザクション処理とは、直接関係のない話です。 (実際は処理効率等に大きく影響するので、どうでも良い話ではないけど..)
その他の回答 (4)
- chukenkenkou
- ベストアンサー率43% (833/1926)
DBMSが書かれていないので、私の知っているDBMSの処理方式で回答します。 更新命令が実行された場合、I/Oバッファ上でのみ更新されます。この更新が媒体に反映されるのは、同期点設定時かI/Oバッファに空きがなくなった時点です。 更新のためにI/Oバッファに上がっているブロックは、排他制御により他のトランザクションからは矛盾が起こる更新はできないようになっています。
- a-saitoh
- ベストアンサー率30% (524/1722)
トランザクションという考え方をする限りは、いつ書き込まれるかということは「分からない/決まっていない」のが正解だとおもいますよ。 「コミットしたら、それ以降は他のトランザクションに、更新したデータが見えるようになる」それだけです。 あるテーブルにあるデータが入っているように見えることと、そこに本当にデータがあることはイコールではありません。 一応、最もありそうな状況としては、 「writeの時点で書き込むが、未コミットというフラグを立てておく。 endの時点で、未コミットフラグを消す。 」というのが想像されます。
- O_cyan
- ベストアンサー率59% (745/1260)
>実際にA*100が書き込まれるのは 実際にだとコミットした時にだと思いますけど。 何のデータベースか不明ですが・・ SQLServerの場合だとモードによります 自動コミットではwrite時にレコードの挿入が確定されます。ループ処理でもあればループ内の処理がその都度行われます。ロールバックはできません。 COMMIT TRANSACTIONで確定するタイミングを明示的に指定できるモード ではコミットされるまで実際には書き込まれません。なのでロールバックすれば取消できる。
- o_chi_chi
- ベストアンサー率45% (131/287)
DBがなにか分かりませんが、トランザクション命令が Bigin~EndならEndで反映されます。 ちなみに自トランザクション内ならまだコミットされて いなくても参照できるDBもあります。