• ベストアンサー

トランザクション

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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

>実際にA*100が書き込まれるのは >end >したときなのか >write >したときなのか 書き込むタイミングは、RDBによって変わります。 通常は、書き込むタイミングは問題になりません。 いつの時点を持って、確定されるかが大事だと思いますよ。 例えば、物理的にディスクの更新が未処理でも、コミット済みの更新は、 他のトランザクションに更新後の状態が参照可能なRDBがあります。 逆に、物理的にディスクを更新済みでも、コミットしていない場合は、 他のトランザクションには、更新前のデータを見せる仕組みのRDBが あります。これは、最終的にコミットしなければ、RDB自身がロールバックを 保証する仕組みになります。 ユーザから見ると、物理更新のタイミングは、実装上の問題であって、 トランザクション処理とは、直接関係のない話です。 (実際は処理効率等に大きく影響するので、どうでも良い話ではないけど..)

その他の回答 (4)

回答No.4

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

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.3

トランザクションという考え方をする限りは、いつ書き込まれるかということは「分からない/決まっていない」のが正解だとおもいますよ。 「コミットしたら、それ以降は他のトランザクションに、更新したデータが見えるようになる」それだけです。 あるテーブルにあるデータが入っているように見えることと、そこに本当にデータがあることはイコールではありません。 一応、最もありそうな状況としては、 「writeの時点で書き込むが、未コミットというフラグを立てておく。 endの時点で、未コミットフラグを消す。 」というのが想像されます。

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.2

>実際にA*100が書き込まれるのは 実際にだとコミットした時にだと思いますけど。 何のデータベースか不明ですが・・ SQLServerの場合だとモードによります 自動コミットではwrite時にレコードの挿入が確定されます。ループ処理でもあればループ内の処理がその都度行われます。ロールバックはできません。 COMMIT TRANSACTIONで確定するタイミングを明示的に指定できるモード ではコミットされるまで実際には書き込まれません。なのでロールバックすれば取消できる。

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.1

DBがなにか分かりませんが、トランザクション命令が Bigin~EndならEndで反映されます。 ちなみに自トランザクション内ならまだコミットされて いなくても参照できるDBもあります。

関連するQ&A

  • トランザクションの考え方

    トランザクションの考え方を教えて下さい。 「データの参照や追加・更新・削除といった処理に矛盾がないことを保証する」という記述を見たのですが、下記の場合も良いのでしょうか。 トランザクションの開始 SELECT * FROM Aテーブル WHERE 項目A = '1' --処理-- UPDATE Aテーブル SET 項目B = '2' WHERE 項目A = '1' トランザクションの終了 開始から終了までの間に他のPCによって SELECT対象のデータが増える可能性があります。 この場合UPDATEするときはやはりSELECTの結果でLOOPするべきなのでしょうか。 上記のようにするとSELECT件数とUPDATE件数は異なってしまうのでしょうか。 環境はVB2005+SQL Server です。

  • MYSQLのトランザクションについて質問です!

    すいません!表題の件で3点質問させてください。 質問1 MySQLの5.0.51を使っていますが、 トランザクションって、どのテーブルが対象なんでしょうか? 例えば、START TRANSACTION とかで開始したりすると、 データベース内のinnoDBのテーブルは、 すべてが対象となるんでしょうか? それとも、readとかwriteとかして 1つづつ指定しないといけないんでしょうか? 質問2 トランザクションすると、 もしやテーブルって、 自動的にreadロックやwriteロック設定された状態になるのでしょうか? 質問3 readロックやwriteロックですが、 書き込み禁止って、どちらなのでしょう? 今まで、ずっとreadロックと勝手に思っていたのですが、 私のMySQLコマンドブック読んでると、 writeロックのような気がしてきたので、 確認のためです… 超愚問、どなたかお付き合いよろしくお願いしますm(__)m

    • ベストアンサー
    • MySQL
  • トランザクション処理について教えてください

    お世話になります まず、トランザクション処理の定義から 「関連する複数の処理を一つの処理単位としてまとめたもの。」 例えば 金融機関での入出金処理、入金処理は成功で、出金処理は失敗 となると、まずいことになります。それで、 この、トランザクション処理は 「すべて成功」か「すべて失敗」のいずれかであること が保証されることらしいのですが、 さて、これを実現する方法を教えてください。 ACCESSのVBを使っての話で、エクセルファイルの作成や更新も あります。 また、どういった所を調べればいいかのアドバイスだけでもありがたいです 何か Begin Transaction ~ End Transaction のような方法を取ると聞いたことがあるのですが。

  • MySQLのトランザクションについて

    WEBアプリ上の、MySQLのトランザクションについて質問です。 トランザクションは、データの挿入に矛盾がない場合commitすることによって データの挿入等を確定する機構だとおもいますが、 この仕組みって、トランザクション中は作業対象のテーブルは実行中のクライアント以外 アクセスできなくなる(※つまりロック?がかかっている?)のでしょうか? そうじゃないと、意味がないですよね?やっぱり。。。 また仮にですが、例えばAというクライアントがWEBサイトにアクセス中に Bというクライアントが待ったく 同じ動作を同じタイミングでアクセスした場合ってどうなるのでしょうか? 実際、WEBアプリでそこまでの例外というか処理って行うものでしょうか? また、ちなみにMySQLの場合、 "START TRANSACTION" というSQL文だけでなく AUTOCOMMIT = 0 として、自動コミットをオフにしつつ beginという式で トランザクションを開始する方法があるようですが、実際はどちらの方が当たり前のほうほうなのでしょうか? 識者の方ご教授ください。

    • ベストアンサー
    • MySQL
  • トランザクション中にSELECTした場合について

    InnoDBを使っているのですが、 以下の1.から5.の処理の間に、サーバー1.の「テーブルA」へ SELECTを掛けた場合、何か遅い気がします・・原因は何でしょうか? 1.サーバー1でトランザクション開始 2.サーバー1の「テーブルA」をDELETEでを全削除 3.サーバー2から「テーブルA」の新しいデータを取得 4.3.で取得したデータをサーバー1の「テーブルA」へINSERT 5.サーバー1でトランザクション終了 他のトランザクションでDELETEされたレコードに対し、 SELECTすると結果が返るのは遅いでしょうか?

    • ベストアンサー
    • MySQL
  • トランザクション処理について

    質問させて下さい。 以下の処理を行なっております。 1. トランザクション処理開始 2. テーブルAからデータをDELETE 3. テーブルBへデータをINSERT 4. トランザクション処理終了 上記処理の場合の「TYPE=InnoDB」指定の仕方が不安です。 現在はロールバックの可能性のあるテーブルAのみ「TYPE=InnoDB」を指定しています。 その状態でコミットもうまくいっているのですが、テーブルBに「TYPE=InnoDB」を 指定しなくてもよいものなのでしょうか。 環境 MySql 4.0.24

    • ベストアンサー
    • MySQL
  • トランザクション処理について

    トランザクション処理について、ちょっと疑問に思うことがあります。 トランザクション処理とは、クライアントの異常終了などで、中途半端な状態で終わったデータはロールバックされ、元の状態にもどされることですよね?では、サーバが突然フリーズした場合どうなるのでしょうか?トランザクション処理もできないため、中途半端な状態で終わったデータは手動で整合性を合わせる必要があるのでしょうか? かなり、基本的なことを聞いていますが、DBの知識がないためどなたか教えてください。

  • トランザクションの利用

    はじめて質問させていただきます。 PHP4.4 + MYSQL5でinnoDBを利用したトランザクション処理の勉強をしたいのですが、オープンソースやフリーのスクリプトで参考になるようなものはないでしょうか。いろいろ見たのですがMYISAMがほとんどで・・。 トランザクション処理の概念は分かるのですが、いざPHPでその動作を実現しようとしても、どうやれば良いのかがわかりません。 BEGINで始まりCOMMITで終わるのは分かるのですが、PHPでどのように書けば良いのでしょう。 参考になるスクリプトやサイトがあれば教えていただきたいです。

    • ベストアンサー
    • MySQL
  • トランザクション中に別のトランザクションは開始できますか?

    DBはサイベースを使っています。初心者です。 以下のような動作をしているシステムの一部を改造することになりました。 1)カーソルAオープン 2)トランザクション開始 3)フェッチ 4)1トランザクションでの処理数分終了済みでなければ、3)から繰り返し 5)commit/rollback 6)終了済みでなければ 2)から繰り返し 7)カーソルAクローズ 今回、3)でフェッチしたレコードのある項目をキーとして 別のテーブルを検索しなければならないのですが、 3)の後に、カーソルBオープンとフェッチのみを追加しただけでは問題があると思うのですが、同一プロセスから、トランザクション中に別のトランザクションを開始することは可能なのでしょうか? なお、このトランザクションでは、レコードの追加や削除は行いません。 どうぞよろしくお願いいたします。

  • ロングトランザクションについて

    お世話になります。 長時間トランザクション処理を行おうと思うのですが、 (3000万件のデータを2つのテーブル間でコピーします。  トランザクション処理中、継続して論理ログのバックアップを行います) ロングトランザクション(そのまま?)という用語があり、 長時間のトランザクション処理には問題があると聞きました。 ロングトランザクションの問題について、ご存知の方、教えてください。 よろしくお願い致します。