トランザクション

データベースに置いてトランザクションは 多くのプログラミング言語の関数みたいなものですか?

maiko0333 さんからの 回答

  • 2018/01/09 03:44
  • 回答No.1
maiko0333

ベストアンサー率 19% (839/4398)

少し違うかな。

トランザクションとは1つのまとまった処理という意味では関数と同じですが、
トランザクションはやりかけたモノを元に戻す事ができます。

銀行で1万円引き出した時、通帳から1万円引き、機械から1万円を出すという
処理があります。何処かでエラーが生じて機械から1万円が出せなくなったら
通帳から引いた1万円をもとに戻すことができます。
関数では1万円は戻りません。
お礼コメント
kirawaremono_

お礼率 95% (58/61)

回答ありがとうございます!
投稿日時:2018/01/09 20:39
この回答にこう思った!同じようなことあった!感想や体験を書こう!
この回答にはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A
  • JDBCでのトランザクション・排他制御 Java

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

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

    お世話になります。 現在、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; ※前提として、テーブルを使用するユーザーは多数います。 ご存知の方、ご回答いただけるれば幸いです。 よろしくお願い致します。...

  • エラーについて(更新) Microsoft ASP

    Txtファイルには 1,A ~ 10,A のデータが入ってます。 データベースはmysqlで mysqlにはフィールドは ID NAMEで 1  1 ~ 9  1 のデータ9つが入ってます。 Txtファイルの10番目のデータを更新させると データベースにそれに対応したコードがないため エラーが出るはずなのですが、 エラーの形が次のようになります。 データが登録されました。データが登録されました。アクティブなトランザクションがありません。 アクティブなトランザクションがありません。 アクティブなトランザクションがありません。 アクティブなトランザクションがありません。 アクティブなトランザクションがありません。 アクティブなトランザクションがありません。 アクティブなトランザクションがありません。 アクティブなトランザクションがありません 何故なのでしょうか? 自分ではtxtファイルの10番目のデータを更新するときにだけエラーがでると考えているのですがそのように 動作してくれません。何故そのように動作しないのでしょうか?また、エラーがでているにもかかわらず 更新処理は全て正常に動作しています。 コードについても載せたいのですが 文字数制限で載せることができませんので 回答していただいた後に、補足で載せさせて頂きたい と思います。...

  • 平成23年 春期 基本情報技術者 午前 問19 情報処理技術者

    解説にある、「データベースサーバでは、1トランザクション当たり、データベースの 10 データブロックにアクセスする SQL が実行される。データブロックのアクセスに必要なデータベースサーバの CPU 時間は, 0.2 ミリ秒で、CPU 使用率の上限は、80%であるから、処理できるトランザクションの数は 400 件になる。 」で、なぜ400件になるのかがわかりません。 問題文から、1トランザクションにつき、0.2ミリ秒かかる。 ということは、2秒につき、300トランザクション処理する。 ということは、1秒ではその半分で、150トランザクション処理する。 ということは、150トランザクション×0.8(CPU 使用率の上限)=120トランザクションでは?? http://情報処理試験.jp/FE23a-am/k19.html...

  • 2人のユーザーが同時アクセス時のトランザクション MySQL

    AユーザーとBユーザーがいてmysqlデータベース(innoDB)に同時アクセスします。 (実際にはphpから行っています) このときAtomicity(原子性)が保たれていないように見える現象が3割程度の確率で発生します。 以下がその問題の現象が発生する流れです。 error_logで出力したものです。 beginTransactionとcommitTransactionは、実際にはphpのpdoのメソッドを呼んでいます。 テーブル1 : state (初期値 0) テーブル2 : answer (初期値 0) stateに対しては常に行の排他ロックをかけている(必ずテーブル2に対するアクセス前) (念のため、stateに対するアクセスはもちろん同じレコードに対してです。 answerに対するアクセスももちろん同じレコードに対してです。) B : beginTransaction 前 B : beginTransaction 後 B : answer=0を読み込み確認 B : state=0を読み込み確認 B : answer=1を書き込む B : state=3を書き込む A : beginTransaction 前 A : beginTransaction 後 B : commitTransaction 前 :state=3を読み込み確認 B : commitTransaction 前 :answer=1を読み込み確認 A : state=3を読み込み確認 // 問題 A : answer=0を読み込み確認 // A : commitTransaction 前 :state=3を読み込み確認 A : commitTransaction 前 :answer=0を読み込み確認 B : commitTransaction 後 :state=3を読み込み確認 B : commitTransaction 後 :answer=1を読み込み確認 A : commitTransaction 後 :state=3を読み込み確認 A : commitTransaction 後 :answer=1を読み込み確認 問題はAユーザー側の途中の処理でstate=3とanswer=0という、中途半端な組み合わせの値を読み込んでしまっていることです。 あるべき状態はAユーザー側で、state=0とanswer=0あるいはstate=3とanswer=1と確認できることです。 一体何が起こっているのでしょうか。 また解決方法はどのようなものでしょうか。 直接の答えでなくてもヒントだけでも頂けると助かります。...

ページ先頭へ