アプリ版:「スタンプのみでお礼する」機能のリリースについて

データベースのトランザクションで
Aというデータがあるとき
begin
から始まって
end
で終了ですが
その間に
read(A)
write(A:A*100)
という処理を行ったとき
実際にA*100が書き込まれるのは
end
したときなのか
write
したときなのか
どちらですか?

A 回答 (5件)

>実際にA*100が書き込まれるのは


>end
>したときなのか
>write
>したときなのか

書き込むタイミングは、RDBによって変わります。
通常は、書き込むタイミングは問題になりません。
いつの時点を持って、確定されるかが大事だと思いますよ。

例えば、物理的にディスクの更新が未処理でも、コミット済みの更新は、
他のトランザクションに更新後の状態が参照可能なRDBがあります。
逆に、物理的にディスクを更新済みでも、コミットしていない場合は、
他のトランザクションには、更新前のデータを見せる仕組みのRDBが
あります。これは、最終的にコミットしなければ、RDB自身がロールバックを
保証する仕組みになります。

ユーザから見ると、物理更新のタイミングは、実装上の問題であって、
トランザクション処理とは、直接関係のない話です。
(実際は処理効率等に大きく影響するので、どうでも良い話ではないけど..)
    • good
    • 0

DBMSが書かれていないので、私の知っているDBMSの処理方式で回答します。



更新命令が実行された場合、I/Oバッファ上でのみ更新されます。この更新が媒体に反映されるのは、同期点設定時かI/Oバッファに空きがなくなった時点です。
更新のためにI/Oバッファに上がっているブロックは、排他制御により他のトランザクションからは矛盾が起こる更新はできないようになっています。
    • good
    • 0

トランザクションという考え方をする限りは、いつ書き込まれるかということは「分からない/決まっていない」のが正解だとおもいますよ。



「コミットしたら、それ以降は他のトランザクションに、更新したデータが見えるようになる」それだけです。

あるテーブルにあるデータが入っているように見えることと、そこに本当にデータがあることはイコールではありません。

一応、最もありそうな状況としては、
「writeの時点で書き込むが、未コミットというフラグを立てておく。
endの時点で、未コミットフラグを消す。
」というのが想像されます。
    • good
    • 0

>実際にA*100が書き込まれるのは


実際にだとコミットした時にだと思いますけど。
何のデータベースか不明ですが・・
SQLServerの場合だとモードによります
自動コミットではwrite時にレコードの挿入が確定されます。ループ処理でもあればループ内の処理がその都度行われます。ロールバックはできません。

COMMIT TRANSACTIONで確定するタイミングを明示的に指定できるモード
ではコミットされるまで実際には書き込まれません。なのでロールバックすれば取消できる。
    • good
    • 0

DBがなにか分かりませんが、トランザクション命令が


Bigin~EndならEndで反映されます。

ちなみに自トランザクション内ならまだコミットされて
いなくても参照できるDBもあります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!