Postgresqlについて2つ質問があります。
例えば
idとmameをInsertし、新規にDBに登録する処理にトランザクション処理は必要なのでしょうか?
テーブルのデータを全て取得する処理を行う時、排他制御は必要でしょうか?(そのテーブルに他から接続してくる可能性はあります)
色々調べたのですがトランザクション処理と排他制御の使い方がピンときてません
よろしくお願いします!
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
排他制御というのは、複数同時におこなわれる操作について、データの不整合が起きないように他のセッションの操作を制限する機能です。
良くある例ですが銀行口座を例にすると、
- ある口座に残高がn以上あることを確認する
- その口座から-nする
- 別の口座に+nする
という処理が2つ同時に走った場合
- セッションAがある口座に残高がm以上あることを確認する
- セッションBが同じ口座について残高がn以上あることを確認する
- セッションAがその口座から-mする
- セッションBがその口座から-nする←マイナスになるかも!
ということが起きえます。これを防ぐために、
- 操作する口座を変更できないようロックを獲得する
- ある口座に残高がn以上あることを確認する
- その口座から-nする
- 別の口座に+nする
- ロックを解放する
こういう形で排他制御するわけです。
実はこれはかなり恣意的な例で、排他制御はこのように手動でおこなうことも出来ますが、たいていの場合個々の操作やトランザクションと紐付けて自動的におこなわれます。
トランザクションというのは、複数の操作をひとまとめにした固まりです。トランザクションには
- 操作の固まりが「全ておこなわれた」か「全ておこなわれなかった」のどちらかにしかならないことを保証する(複数の操作の途中まで完了したという状態にならない)
- 複数のトランザクション間で、トランザクションの途中の状態の見え方を制御する
という機能があります。2番目の方は「トランザクション分離レベル」と呼ばれます。「一つのトランザクションが走っている間は他のトランザクションは一切処理できない」(=シリアライザブルと言われる分離レベル)とすると簡単なのですが、パフォーマンスがとても悪くなります。ですので、デフォルトはもう少し緩いレベルになっています。このレベルに応じて、適切な排他制御がおこなわれます。
idとmameをInsertし、新規にDBに登録する処理にトランザクション処理は必要なのでしょうか?
INSERT1回だけなら不要です。2回以上行う場合は必要かもしれません。
テーブルのデータを全て取得する処理を行う時、排他制御は必要でしょうか?(そのテーブルに他から接続してくる可能性はあります)
こちらも同様に1回だけなら不要です。2回以上おこなうなら必要かもしれません。
投稿2017/08/18 00:34
総合スコア1449
0
ベストアンサー
投稿2017/08/17 12:02

退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/19 05:57 編集

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/18 01:11
2017/08/18 16:15
2017/08/19 03:44
2017/08/19 06:05 編集
2017/08/19 07:49
2017/08/19 09:09