質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.09%

トランザクション処理や排他制御について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 5,627

score 67

Postgresqlについて2つ質問があります。
例えば
idとmameをInsertし、新規にDBに登録する処理にトランザクション処理は必要なのでしょうか?

テーブルのデータを全て取得する処理を行う時、排他制御は必要でしょうか?(そのテーブルに他から接続してくる可能性はあります)

色々調べたのですがトランザクション処理と排他制御の使い方がピンときてません

よろしくお願いします!

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/17 22:38

    ありがとうございます。読ませていただきました。
    新たに出てきた疑問なのですが、INSERT INTO テーブル名 VALUES(値1, 値2, ...値10):
    上記SQL文でデータを追加するときに値8を追加する際にエラーが発生すると値7までは登録されて値8からは登録されないのでしょうか?

    それとも、値1からデータが順番に記録されていくという考え方が悪いのでしょうか?

    キャンセル

  • 2017/08/18 01:12 編集

    一般的なDBMSでは、トランザクションの最低の単位はデータ1行ですから、行の途中までということは一般的にはありません。

    キャンセル

  • 2017/08/18 09:00

    ありがとうございます!

    キャンセル

0

排他制御というのは、複数同時におこなわれる操作について、データの不整合が起きないように他のセッションの操作を制限する機能です。

良くある例ですが銀行口座を例にすると、

  1. ある口座に残高がn以上あることを確認する
  2. その口座から-nする
  3. 別の口座に+nする

という処理が2つ同時に走った場合

  1. セッションAがある口座に残高がm以上あることを確認する
  2. セッションBが同じ口座について残高がn以上あることを確認する
  3. セッションAがその口座から-mする
  4. セッションBがその口座から-nする←マイナスになるかも!

ということが起きえます。これを防ぐために、

  1. 操作する口座を変更できないようロックを獲得する
  2. ある口座に残高がn以上あることを確認する
  3. その口座から-nする
  4. 別の口座に+nする
  5. ロックを解放する

こういう形で排他制御するわけです。

実はこれはかなり恣意的な例で、排他制御はこのように手動でおこなうことも出来ますが、たいていの場合個々の操作やトランザクションと紐付けて自動的におこなわれます。

トランザクションというのは、複数の操作をひとまとめにした固まりです。トランザクションには

  • 操作の固まりが「全ておこなわれた」か「全ておこなわれなかった」のどちらかにしかならないことを保証する(複数の操作の途中まで完了したという状態にならない)
  • 複数のトランザクション間で、トランザクションの途中の状態の見え方を制御する

という機能があります。2番目の方は「トランザクション分離レベル」と呼ばれます。「一つのトランザクションが走っている間は他のトランザクションは一切処理できない」(=シリアライザブルと言われる分離レベル)とすると簡単なのですが、パフォーマンスがとても悪くなります。ですので、デフォルトはもう少し緩いレベルになっています。このレベルに応じて、適切な排他制御がおこなわれます。

idとmameをInsertし、新規にDBに登録する処理にトランザクション処理は必要なのでしょうか?

INSERT1回だけなら不要です。2回以上行う場合は必要かもしれません。

テーブルのデータを全て取得する処理を行う時、排他制御は必要でしょうか?(そのテーブルに他から接続してくる可能性はあります) 

こちらも同様に1回だけなら不要です。2回以上おこなうなら必要かもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/19 14:30 編集

    1行とは書いていません。引用したものも回数で表現されています。
    仮に、トランザクションや排他の影響範囲を1行(1レコード)に対して言われていても関係はありませんが。
    伝わっていないようなので、別な説明をしてみます。
    >トランザクションというのは、複数の操作をひとまとめにした固まりです。
    と書かれていますが、「複数の操作でない場合はトランザクションでは無い」と思われているということですか?
    トランザクション処理というのは、通常、BEGIN~COMMIT(or ROLLBACK)で括られたものを言います。(意識していない暗黙的なBEGINや暗黙COMMITも含みます)
    括られたものが何行だろう何回だろうと、関係ありません。
    また、排他制御も、排他関係にある相手とのタイミングだけの話なので、回数は関係ありません。

    キャンセル

  • 2017/08/19 16:49

    意図的にトランザクションを構成する必要があるかという質問でしょう。暗黙のトランザクションがあるじゃないかという言葉遊びみたいな話にはお付き合いできません。

    キャンセル

  • 2017/08/19 18:09

    議論を、論破するのではなく、言葉遊びという風に片付けられては、これ以上は不毛ですね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る