トランザクション、コミット、ロールバックとはなんでしょうか。
受付中
回答 5
投稿
- 評価
- クリップ 0
- VIEW 6,301
前提・実現したいこと
PHPを勉強中です。
発生している問題・エラーメッセージ
PDOを書籍を参考にデータベース接続で利用したのですが、トランザクション、コミット、ロールバックという単語が出てきました。トランザクションはそれ以上分けることのできない処理、トランザクションが成功したときにする処理がコミット、逆に失敗したときはロールバックをする、というようにGoogle検索などを利用しながら整理しましたが、PHPを実際に書くときになるとその3つをどのように書けばいいのか、利用するのかに躓いてしまうので、より理解を深めるために知識のある方にもう一度この3つの単語とその関係について教えてもらおうと思い質問しました。
該当のソースコード
なし。
試したこと
Google検索で言葉の意味を検索する。
補足情報(言語/FW/ツール等のバージョンなど)
PHP7.0
よろしくおねがいします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+12
他の方の回答を見ましたが、
PHPを実際に書くときになるとその3つをどのように書けばいいのか
に回答している方がいらっしゃらないようなので、参戦。
トランザクションおよび自動コミットによると、PDOはデフォルトで自動コミットモードで動作します。自動コミットとはどういうものかというと、SQLを実行する前に自動的にトランザクション開始し、実行後、自動的にトランザクションをコミットします。
自動コミットでは、常に自動的にコミットしてしまうので、複数のSQLを1個のトランザクションで処理することはできません。これでは、複数の処理をアトミックに処理(成功するか否かで中途半端に成功することがない)することができません。
たとえば、銀行振り込みを例にして、「AさんがBさんの口座に100円振り込んだ」という処理をSQLにすると、「Aさんの口座の残額から100円引く」というSQLと「Bさんの口座の残額に100円足す」という2つのSQLを実行することになります。この2つのSQLは何があっても(途中でシステム障害が発生しても)、片方だけ成功するということがあってはならないので、1個のトランザクションにまとめる必要があります。
この場合、PDOでは、PDO::beginTransaction() を最初のSQLの前に実行することで、自動コミットを避ける必要があります。たとえば、
- PDO::beginTransaction()
- Aさんの口座の残額から100円引く
- Bさんの口座の残額に100円足す
- PDO::commit()
というプログラムを書くと、自動コミットは行われず、1個のトランザクションで実行されます。途中でエラーが発生した場合は PDO::rollBack() を呼んでトランザクション全体をキャンセルします。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+3
トランザクションが出来ていない場合の不具合例を解説した記事を以前書きましたので紹介します。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
以前に同様の質問がありました。
参考になるかもしれません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
参考書を紹介しておきます。
- 中山清喬・飯田理恵子『スッキリわかるSQL入門』インプレス, 2013.
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
トランザクション
トランザクションと呼ばれる不可分な操作から構成される情報処理の形態。
既知の一貫した状態のデータベースを維持するよう設計されており、相互依存のある複数の操作が全て完了するか、全てキャンセルされることを保証する。
コミット
データベースにおいてトランザクションによる内容更新を恒久的なものとして確定することを指す。
一般にトランザクションの終了時にその更新を確定するという意味で「コミットする」などと使用する
ロールバック
トランザクション処理システムはデータベースの整合性を保証するため、データベース更新の中間状態を記録し、トランザクションがコミットできなかった場合にデータベースを既知の状態にリストアするためにそのような記録を活用する。例えば、トランザクションによる更新前のデータベースの情報のコピーを事前に取って置く(これをbefore imageと呼ぶ)。トランザクションがコミット前に失敗した場合、そのコピーを使ってデータベースをトランザクション開始前の状態に戻す。これを「ロールバック」と呼ぶ。
by Wikipedia
https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%87%A6%E7%90%86
https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88
どの変が難しいですか?
トランザクションは処理の名前です。
始まりを宣言して、なんやかんや更新処理を覚えてくれています。(メモリに保存程度、他人には見えません)
確定(コミット)すると更新内容がDBに書き込まれます。(他人に見えます)
取り消し(ロールバック)は、確定する前に反映せずに終了!っと言う感じですね。
超勝手な説明ですが、そんな感じ... かなw(有識者の皆様ツッコミよろしくお願いします)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる