• ベストアンサー

コミットとは何でしょうか?

うまく意味を理解できません。 どなたか知っている方がいらしたら教えてください。 宜しくお願い致します。

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

  • ベストアンサー
  • hana432
  • ベストアンサー率37% (6/16)
回答No.3

INSERT,UPDATE,DELETE等を発行するだけでは、テーブルへの書込みが確定していません。 COMMIT(INSERT等の処理後の結果を確定)またはROLLBACK(INSERT等の処理前の状態に戻す)を発行してやっとテーブルへの書込みが終了します。 例えば、乱暴ですが下記のテーブルがあったとします。 (1)商品テーブル  カラム:商品名・・・商品名を格納      在庫数・・・在庫品が何個残っているかを格納  データ:商品名  在庫数      -----------------      A品     10 (2)売上テーブル  カラム:商品名・・・商品名を格納      売上数・・・売り上げた個数を格納  データ:商品名  売上数      -----------------      A品      0 で、ある日、A品が5個売れたとします。データとしては、商品テーブルのA品を5個を減らし、売上テーブルのA品を5個増やしたいとします。  商品テーブルデータ:商品名  在庫数       商品名  在庫数            ----------------       ----------------            A品     10  処理後  A品      5                      →→→           となるようにしたい。  売上テーブルデータ:商品名  売上数       商品名  売上数            ----------------       ----------------            A品      0       A品      5 処理(SQL)としては、下記のような感じになると思うのですが、   UPDATE 商品テーブル SET 個数 - 5 WHERE 商品名 = 'A品'; -- (1)   UPDATE 売上テーブル SET 個数 + 5 WHERE 商品名 = 'A品'; -- (2) で、(1)の処理は成功したけど、(2)の処理が何らかの原因で失敗したとします。 もし、UPDATEした結果が即テーブルに確定されるんだったら、データは下記のようになってしまいます。  商品テーブルデータ:商品名  在庫数       商品名  在庫数            ----------------       ----------------            A品     10  処理後  A品      5                      →→→            売上テーブルデータ:商品名  売上数       商品名  売上数            ----------------       ----------------            A品      0       A品      0 A品は5個売れたので在庫数は5個減ったのに、売上数には計上されていない。一体、A品の5個はどこに行ってしまったの?!ということになってしまいます。 これが「整合性」というやつです。 それで、上記処理の(1)と(2)が両方成功して初めて、テーブルを確定しないとデータが変になってしまいます。 commitは、そのために必要です。 逆に、上記処理の(1)が成功したけど(2)は失敗しちゃった時は、rollbackをしてやります。すると、(1)の処理を行う前のデータに戻って確定します。 上の説明を加味した処理(SQL)はこんな感じです。 begin   UPDATE 商品テーブル SET 個数 - 5 WHERE 商品名 = 'A品'; -- (1)   UPDATE 売上テーブル SET 個数 + 5 WHERE 商品名 = 'A品'; -- (2) commit; -- ↓(1),(2)の処理でなんかエラーが起こると即、ここに飛んでくる exception when others rollback; end; 補足:ROLLBACKはどのデータ時点に戻る? COMMIT,ROLLBACKが発行されてから、最初にINSERT,UPDATE,DELETEが発行された時点に戻ります。 例1) begin UPDATE 商品テーブル SET 個数 - 5 WHERE 商品名 = 'A品'; -- (1) UPDATE 売上テーブル SET 個数 + 5 WHERE 商品名 = 'A品'; -- (2) commit; -- ↓(1),(2)の処理でなんかエラーが起こると即、ここに飛んでくる exception when others rollback; end; この場合、(2)処理中に障害が発生すると、(1)のUPDATEが行われる前のデータ状態に戻ります。 例2) begin UPDATE 商品テーブル SET 個数 - 5 WHERE 商品名 = 'A品'; -- (1) commit; UPDATE 売上テーブル SET 個数 + 5 WHERE 商品名 = 'A品'; -- (2) commit; -- ↓(1),(2)の処理でなんかエラーが起こると即、ここに飛んでくる exception when others rollback; の場合だと、(1)の処理後にcommitが発行されているので(1)のデータは確定している為、(2)のUPDATEが行われる前に戻ります。 commit,rollbackのタイミングは意外にも重要です。 長いばっかりで分かりにくかったかもしれませんが、参考になれば幸いです。頑張ってくださいね。 ※表がずれて見にくいので、一旦メモ帳かなんかに貼り付けて読んでください。すみません。

saruno
質問者

お礼

非常に分りやすかったです。 どうもありがとうございました。

その他の回答 (3)

  • Hk2001
  • ベストアンサー率48% (24/49)
回答No.4

データベースの種類によって記述方法が違うかも知れませんが BeginTrans  'ビギントランス CommitTrans  'コミット RollbackTrans 'ロールバック の3がっセットになります。主にトランザクション処理とでもいいましょうか 各内容は ビギントランス:トランザクションの開始 コミット:ビギントランスから後の更新されたテーブルの更新 ロールバック:ビギントランスを実行した状態に戻す っていう感じです。 テーブルの更新(追加、更新、削除など)をするときに 多く使用します。 これは、システムの整合性を保つためなどに大切です。 たとえば在庫管理のシステムで 入荷テーブル 出荷テーブル 在庫テーブル があったとります。 入荷時は 入荷テーブル 在庫テーブル を更新 出荷時は 出荷テーブル 在庫テーブル を更新 となります。 各処理でエラーが発生したときに更新結果が途中までで終わってしまわないように 更新するときは トランザクション処理を使用してデータの不整合を防ぎます。 ※※※簡単な処理の流れ※※※※ ビギントランス Select Case 更新処理 Case 正常更新 コミット Case 異常終了 ロールバック End Select ※※※※※※※※※※※※ またトランザクション処理は データベースによってデータベースの種類って更新に制約が発生します。 どのような制約があるは、各ヘルプや専門書などで確認してください。

  • k_eba
  • ベストアンサー率39% (813/2055)
回答No.2

データベースの時に使います。 例えば在庫管理のシステムがあって、在庫ファイルを更新して、出荷ファイルを 更新する処理があったとして 在庫ファイルを更新して出荷ファイルが書けなかった時に 在庫ファイルと出荷ファイルで不整合が発生します。 そこで異常を見つけた時にロールバック(なかったこと)し データベースを戻します。 しかし1日の処理のどこまで戻すかを決めるのがコミットです。 コミットを切るとこれ以上は戻らなくて良いよと言うことです。 つまり 在庫ファイルを更新し出荷ファイルも更新したらコミットを切るのです。 こんなもんでどうでしょうか? 参考になれば幸いです

  • madman
  • ベストアンサー率24% (612/2465)
回答No.1

データベースを利用する場合に使います。 データベースにレコードを書き込んだだけでは、反映されません。 commitを行うことによりその情報をデータベース上に反映させることができます。 何レコードかにまたがって情報を記録する場合、すべてのレコードが正しく書けた場合に、commitしてデータを確定します。 これとは異なり、途中で書き込みを失敗した場合、以前に記録したものも削除しないとデータの整合性が取れない場合もあります。このときはロールバック(ROLLBACK)を利用し、すべてなかったことにします。

関連するQ&A

  • コミットの意味は?

    『その事業に,全力でコミットします。』こんな使い方は出来ますか? 言いたい事は,「その事業に,全力で貢献します。」こんな意味が出ればいいのですが日本語として大丈夫でしょうか? 誰かが使っていた気がするのですが,意味を調べてみるとネガティブな意味が多くどうも違う気もするし,本当のところこういった使い方は出来ますか? ご存知の方よろしくお願い致します。

  • subclipseでコミットできない

    Eclipseでない別のツールでバイナリファイルを更新したのですが、Eclipseのパッケージエクスプローラのファイル名左のアイコンが、添付の画像の赤枠のアイコンとなり、commitしようとしても「最後のコミットからファイルの変更もしくは追加はありません」と出てしまい、コミットできません。 別のPCにバイナリファイルをコピーし、そのPCのEclipseのパッケージエクスプローラでバイナリファイルを参照すると、更新されたことを示す"*"のアイコンが付いており、正常にcommitできます。 この現象は必ず発生するわけではなく、過去2年で2回ほどです。 この現象のおかげで顧客へのリリース洩れが発生したことがあり、根本問題を解決しないことには業務に使えません。 以下の点でご存じの方、ご教授をお願い致します。 (1)添付の画像の赤枠のアイコンの意味は何でしょうか? (2)commitできなくなった理由(更新を検知できない理由)は何でしょうか? (3)この状態からcommitできるようにするにはどうすれば良いのでしょうか? Eclipseのバージョンは3.5(Pleadesを入れてます) Subclipseのバージョンは1.6.13です。 以上、よろしくお願いします。

  • コミットってどういう意味でしょうか?

    「結果にコミットする」 のコミットってどういう意味でしょうか?

  • コミットできなくなってしまいました。

    以前は仕事の内容に満足しており、興味のあることに携われる喜びがあり ワークライフバランスは充実していたのですが、 ここ数年、度重なるハラスメントを通して、 会社へ貢献する気持ちがどんどん萎えてしまい、 何にも協力したくない、そう思うようになってしまいました。 とはいえ、お給料をいただいているので、やるべきことはやっているのですが 以前のように、自分から働きかけたり、提案したり、という能動的な役割を この環境においてはしたくない、そう思うようになってしまっています。 能動的な働きをすることで、また標的になるのが怖いという気持ちや あまりにも世の中に通用しない独自の価値観が強すぎて、飽きれやしらけてしまう気持ちが 以前のようにコミットメントできない心情につながってしまっています。 どうにか気持ちを切り替えて、今の仕事を続けて行きたいという考えと 新しい仕事や興味を探して、環境を変えたいという考えがあります。 今の仕事を続けるには、どんな風に気持ちを切り替えたら良いと思いますでしょうか? 良いイメージや体験談をシェアしていただきたく存じます。 又、働く環境や生活環境を変えて、うまくいった方のお話しを教えていただきたいです。 追記 現在、処理中ですが、会社はハラスメントの事実を認め、謝罪をしてくれています。

  • コミットチャージ

    こんにちは。 windows 2000のタスクマネージャにあるコミットチャージってなんですか? ”コミット済みの仮想メモリ”と”使用可能なメモリ空間、または現在使用中のメモリサイズ”という2つの文をみつけましたが、この2つがつながらないようなきがします。 制限値や最大値、物理メモリとの関係など理解できません。 アドバイスよろしくお願いします。 また詳しく説明しているHPはあるでしょうか?

  • 結果にコミットするという言い方がわかりましたか

    あのコマーシャルの本体には興味がありませんので、嫌な音であわててチャンネルを変えることにしています。音より気持ち悪いのはコミットするという言い方です。コマーシャルとしての効果は評価されているようですが、皆さんは辞書などで確認する前から結果にコミットするという意味がわかりましたか。

  • 【ビジネスで使う「コミット」の意味】

    顧客とのコミット、チームメンバーとのコミット、 事業戦略のコミット 上記のように使うようですが、意味がわかりません。 ご存知の方がいらっしゃいましたら教えていただけるとありがたいです。よろしくお願いいたします。

  • コミットって簡単に言うと何?

    しすてむとか見るとコミットってありますよね? これが十分無いと動作が不安定になると思うんですが 簡単に言ってコミットって何を指す言葉なんでしょう?

  • svnserverを設置したがコミットできない

    現在、自分のwindows10のPCにSVNサーバを、下記のサイトを参照しながらインストール作業を行っています。 WindowsにSubversion 1.12サーバーを構築する https://blogs.osdn.jp/2019/06/14/subversion.html 最後まで進めて、新規に作成したリポジトリの"repos"というのをtortoiseSvnで svn://192.168.1.188/repos というURLでチェックアウトするとできるのですが、テキストファイル1個をコミットしようとすると、なぜか Error Commit failed (details follow): Error Authorization failed このようなメッセージが出てきてコミットが失敗します。 メッセージ内容でググってみたところ次のようなサイトが出てきました。 https://axion.sakura.ne.jp/blog/index.php?UID=1414755723 このサイトの内容から、svnserve.confの中身の一部に修正を加えないといけないとのことなのですが、 C:¥Apache24 このフォルダ内にsvnserve.confのファイルが見当たらないのですが、どのように解決したら良いかご存知の方いらっしゃいましたら、ご教示よろしくお願い致します。

  • TortoiseSVNにて、コミットができません。

    TortoiseSVNにて、コミットができません。 TortoiseSVNにて、右クリックからコミットを選択し、変更項目確認画面で編集したファイルを選択した上でOKボタンを押下しても、反応がありません。 (一瞬だけウインドウを表示するような振る舞いを見せますが、以後反応なしです。エラーも出ません。) この他、マージ・ロックの取得も同様の現象でできません。 なお、これらの現象は突然現れたものではなく、TortoiseSVN初回インストール直後から発生しています。 ただし、チェックアウトや更新、差分の表示などは正常にできます。 また、コマンド(svn commit)によるコミットは正常に実行できます。 さらに、別のクライアントからは、GUIによるコミットができます。 特定のクライアイント特有の問題のようですが、原因がわかる方いらっしゃいますでしょうか? <試したこと> ・ファイアーウォールを無効にする ・日本語化バッチなしで、TortoiseSVNを再インストールする ・リポジトリで管理するファイル数を1つにし、1ファイルのみのコミットを試みる(ファイルサイズは10KB程度) ・匿名ユーザからのリポジトリへの書き込みも許可する <利用環境> WindowsServer2008上に svnserverを構築しており、ネットワーク経由でクライアントからリポジトリにアクセスしています。 また、特定のクライアイントからのみできないと記載しましたが、各クライアイントのOSは全て同じWindowsXPです。

専門家に質問してみよう