• ベストアンサー

Commit しなかったデータは、どうなる?

リレーショナルデータベース管理システムについて確認したいのですが。 バッチ処理とかの途中でシステムがダウンし、Commit しなかったとき データベースは、Commit していないのでトランザクション開始前の状態が 維持されると思うのですがその理解で合っていますか? Commit しなかったトランザクションデータは、破棄されると思うのですが その理解も合っていますか? MySQL の場合について、教えてください。 よろしくお願いします。

  • MySQL
  • 回答数2
  • ありがとう数0

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

  • ベストアンサー
  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.2

追伸: システム立ち上げ時に元に戻りますが、戻すデータが見当たらないなどの場合は、 システムが壊れていますということで立ち上がらなくなってしまいます。

その他の回答 (1)

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

COMMITしないデータはROLLBACKされます(元の値に戻ります) システムが落ちた場合、中途半端な状態で止まりますので、その状態でバックアップは意味が無いです。 システム立ち上げ時にきれいになります。 ※中途半端な状態とは 更新中、データベースには書き込むべきデータが溜まっていきます。(データベースには書かれない) ある程度溜まったらデータベースに書き込みされます。 システムダウンなどあれば、反映されていないデータは破棄されて終わります。 データベースに書き込まれたものは元に戻されます。

関連するQ&A

  • MySQLの簡単な説明をお願いします

    MySQLをWikipediaで調べたところ、 >MySQL(マイエスキューエル)は、RDBMS(リレーショナルデータベースを管理、運用するためのシステム)の実装の一つである。オープンソースで開発されており、GNU GPLと商用ライセンスのデュアルライセンスとなっている。 とあるのですが、あまりよく理解できません。 簡単な説明で良いのでお教えくださる方がいらっしゃると嬉しいです。

  • DB2でSelectした時(rollback,commitの必要性)

    Oracleでの開発が長く、DB2は初めてなので戸惑ってます。 OracleでSelect文を発行する時はトランザクション処理が発生しているわけではないので、rollbackやcommitはしないのですが、DB2を使った今回のシステムではselectをした後でrollbackやcommitを使用するように設計書記述がされています。 必要ないような気がするのですが、DB2ではSelectでも必須なのでしょうか? ご回答よろしくお願いします。

  • ActiveX DLLでのオラクルのトランザクション

    VB6とOracle9iのOO4Oにてシステムを構築しておりますが、一つ解らないことがありましたので、どなたかご教授願います。 あるPG(通常のEXEです)よりActiveX DLLを呼び出してOracleの表へデータを挿入する処理があります。呼び出し元となる通常のEXEはまずOracleの接続処理を記述しています。正常に接続が完了したならトランザクションを開始し、表のDeleteを実行します。その後ActiveX DLLを呼び出して表のInsertを実行しています。再び通常のEXEに制御が戻り、トランザクションの完了(COMMIT)または破棄(ROLLBACK)を行います。しかし、最後のトランザクションのCOMMIT(ROLLBACK)を行うと『コッミト(ロールバック)時にアクティブなトランザクションがありません』というエラーが発生してしまいます。正しくBegin Transactionを実行しているのに、これはどういうこと何のでしょうか。ご存知の方がいらっしゃましたら教えてください。

  • ロックについて

    データベース初心者ですが、よろしくお願いします。 トランザクション処理のロック制御について質問です。 例えば、ユーザAが表に対しupdateを行い、commitを行わなかったとします。このときに、他のユーザBがその表に対しupdateを行った場合、エラーになるのでしょうか? 私は、トランザクション処理というのは、表操作を行ってからcommitするまでの間をひとくくりとして、その間はロックがかかると認識しています。 どなたかご教授願います。

  • insert1つの処理でもトランザクションは必要?

    お世話になります。 現在、MYSQLデータベースを使用したプログラムを書いており、 そこでトランザクションについて質問があります。 トランザクションとは、複数の処理がすべて成功した場合に正式な処理を実行(commit)、1つでも失敗した場合は元に戻す(rollback)というようなことかと思うのですが、 では、1つの処理のみの場合は、トランザクションを使用する必要はないのでしょうか? 例えば、 ・あるテーブルにデータをinsertしたい。 このような単一の処理を書く場合でも、 以下のようにトランザクションを使うべきでしょうか? $dsn = 'mysql:dbname=〇〇〇;host=〇〇〇;charset=utf8'; $user = 'user'; $pwd = 'pwd'; //DB接続 try { $pdo = new PDO($dsn, $user, $pwd); } catch (PDOException $e) { die('DB接続失敗'); } //トランザクション開始 $pdo->beginTransaction(); //INSERT try { $sql = 'INSERT into table (test1, test2, test3) VALUES (:a, :b, :c)'; $st= $pdo->prepare($sql); $ret = $st->execute(array( ':a' => $a, ':b' => $b, ':c' => $c, )); if (!$ret) { throw new Exception('INSERT 失敗'); } //commit $pdo->commit(); } catch (PDOException $e) { //rollback $pdo->rollBack(); } $pdo = null; ※前提として、テーブルを使用するユーザーは多数います。 ご存知の方、ご回答いただけるれば幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • データベースソフトウェアの共有の方法

    規定のOSがインストールされていないNASに、 リレーショナルデータベースソフトを入れて、そこで、 トランザクション処理を行なわせますと、 ファイルの破損が発生しやすいのでしょうか。 それとも、フォーマット形式とかNASの設定とかで、 それを克服させてもらえるのでしょうか。

  • 過去データに対するデータベースのクエリの実行の仕方

    こんにちは。アべです。 データの処理でリレーショナルデータベースを使用しようとしております。 そこで、台帳(例えば顧客台帳)をマスタ登録して使用するのですが、 下記のことがクエリでは出来ずに困っています。 やり方のヒントでもよろしいので教えていただけないでしょうか? ・過去に戻って、トランザクション処理を再実行する際に過去の その時点の台帳情報を引っ張りたい。 (テーブルに時間指定でクエリを投げる方法がわからない。) ・その台帳の情報を確認したい。 (単純に台帳の過去を知りたい。 トリガで更新処理のログを残す手間なやり方しか思い浮かばない。) 本をみてもリレーショナルデータベースに時間軸の概念がないような 気がしております。 (一応調べて見て、スナップショットデータベースがあり、これだと ある特定の時点しか取れず、しかも事前に用意しておかなければならず、 いまいち今回のパターンだと使えないと考えています。) 環境 SQL Server 2008 Service Pack 1 宜しくお願い致します。

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

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

    • ベストアンサー
    • MySQL
  • JDBCでのトランザクション・排他制御

    初めまして。 まだ初心者の身なのですが質問させてもらいます。 サーブレット・jspでJDBCを使いデータベースとの処理を行って簡単なショッピングサイトのようなものを作っています。 まずsetAutocomit() = falseでトランザクションを開始し データベースのUPDATEを行って、最後に確定する場合comit キャンセルする場合rollbackとしています。 しかし1人のユーザーがトランザクションを行っている場合に他のユーザーからアクセスされた場合にデータベースのトランザクション中の値を取ってきたいのですが、どうしてもトランザクションでUPDATEされる前の値になってしまうのです。 これを防止するのが排他制御というものだというのは分かったのですが 実際のやり方については、結構調べたのですがあまり載っていませんでした。 データベースはMySQLを使っています。 よろしければJDBCでの排他制御についてのアドバイス、もしくは詳しく説明されているサイトなどございましたら是非教えてください。 よろしくお願いします。

  • トランザクション中に別のトランザクションは開始できますか?

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