質問: Postgresqlについて2つ質問があります。 例えば idとmameをInsertし、新規にDBに登録する処理にトランザクション処理は必要なのでしょうか? テーブルのデータを全て取得する処理を行う時、排他制御は必要でしょうか?(そのテーブルに他から接続してくる可能性はあります) 色々調べたのですがトランザクション処理と排他制御の使い方がピンときてません よろしくお願いします!
回答: 排他制御というのは、複数同時におこなわれる操作について、データの不整合が起きないように他のセッションの操作を制限する機能です。 良くある例ですが銀行口座を例にすると、 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回以上おこなうなら必要かもしれません。