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

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

新規登録して質問してみよう
ただいま回答率
85.49%
排他制御

排他制御とは、特定のファイル・データへのアクセスや更新を制御することです。特にファイルやデータベースへ書き込みを行う際、データの整合性を保つため別のプログラムによる書き込みを一時的に制御することを指します。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

トランザクション

トランザクションとは、関連・依存する処理を一連の不可分な処理単位として扱う処理方式を指します。トランザクションとして管理された処理は「すべて成功」か「すべて失敗」のいずれかであることが保証される。処理に失敗した場合は、一連の処理がロールバックされます。

Q&A

解決済

2回答

7604閲覧

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

panjaA

総合スコア67

排他制御

排他制御とは、特定のファイル・データへのアクセスや更新を制御することです。特にファイルやデータベースへ書き込みを行う際、データの整合性を保つため別のプログラムによる書き込みを一時的に制御することを指します。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

トランザクション

トランザクションとは、関連・依存する処理を一連の不可分な処理単位として扱う処理方式を指します。トランザクションとして管理された処理は「すべて成功」か「すべて失敗」のいずれかであることが保証される。処理に失敗した場合は、一連の処理がロールバックされます。

0グッド

0クリップ

投稿2017/08/17 11:49

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

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

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

よろしくお願いします!

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

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/18 00:34

suzukis

総合スコア1449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

panjaA

2017/08/18 01:11

回答ありがとうございます。 大変わかりやすかったです。
sazi

2017/08/18 16:15

>INSERT1回だけなら不要です。2回以上行う場合は必要かもしれません。 は、トランザクション処理について言われていますか?それとも排他制御のみについて記述されてますか? 何れにしても、実行する回数で要/不要になったりはしません。
suzukis

2017/08/19 03:44

1行だけのSQLをトランザクションにするとか排他処理をするとかいうシュチュエーションが思い浮かばないのですが、どういう状況でしょうか。
sazi

2017/08/19 06:05 編集

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

2017/08/19 07:49

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

2017/08/19 09:09

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

panjaA

2017/08/17 13:38

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

2017/08/19 05:57 編集

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

2017/08/18 00:00

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問