Upgrade to Pro — share decks privately, control downloads, hide ads and more …

トランザクションに歩み寄る ~はじめの第1歩編~

トランザクションに歩み寄る ~はじめの第1歩編~

トランザクションについて、少し深ぼっていきます。
トランザクションのACID特性やロックについて解説しています。
内容
- ACID特性
- ロック
- 2相ロック方式
- MVCC
- デッドロック
- 危険なトランザクション

Haruki Yoshida

February 08, 2024
Tweet

More Decks by Haruki Yoshida

Other Decks in Programming

Transcript

  1. トランザクションのACID 特性 A tomicity C onsistensy I solation Durability ...

    ... ... ... 原子性 一貫性 独立性 永続性 ( 全て実行 or 1 つも実行されない) ( データの整合性が取れている) ( トランザクションを外部から隠蔽) ( 成功すればデータが保存される)
  2. 共有ロック 排他ロック 共有ロック ◯ ✕ 排他ロック ✕ ✕ ロックとは(1) 共有ロック

    ・・・参照時にかけるロック 排他ロック ・・・更新時にかけるロック テーブルや行にロックをかけるよ リソースの状態 獲得するロック 獲得したいリソースの共有ロックが 開放されるまで待つことになる テーブルや行にロックをかけるよ PostgreSQL には8 種類くらいあるよ
  3. ロックとは(2) users id: 1, name: "user 1" id: 2, name:

    "user 2" id: 3, name: "user 3" id: 4, name: "user 4" Tr1 SELECT * FROM users WHERE id = 2 Tr2 UPDATE users ( 略) WHERE id = 2 SELECT * FROM users WHERE id = 4 Tr 3 SELECT * FROM users WHERE id = 4 id が2 のレコードに共有ロックをかける id が4 のレコードに共有ロックをかける id が2 のレコードの共有ロックが開放されるのを待つ 共有ロックが取得されていても、共有ロックは 取得できるので待たない
  4. id = 1 id = 2 T1 T2 トランザクション1 トランザクション2

    デッドロック(3) ① ロック獲得 ① ロック獲得 ② ロック解放待ち ① ロック獲得 ② ロック解放待ち
  5. 単一のUPDATE 文を途中でキャンセルすると途中まで更新されるの? postgres では全てのステートメント実行前に暗黙的にトランザク ションを開始する ユーザーがキャンセルするとROLLBACK される 複数レコードのUPDATE 文を実行し、一部のレコードのみ更新さ れることはない

    https://www.postgresql.org/message-id/3073cc9b0901272156x60d7deds47d685993823adec@mail.gmail.com https://www.postgresql.org/docs/13/tutorial-transactions.html#:~:text=PostgreSQL%20actually%20treats,transaction%20block. 素朴な疑問 UPDATE users SET name = “user updated”;