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

DBのロックについてあまり意識したことがない人に向けた、実は覚えておきたいロックについての知識...

DBのロックについてあまり意識したことがない人に向けた、実は覚えておきたいロックについての知識 / 技育CAMPアカデミア2023

2023年4月5日(水) サポーターズ主催「技育CAMPアカデミア」で開催されたCARTA HOLDINGSセッションの発表資料です。

・登壇者
株式会社CARTA HOLDINGS
fluctエンジニア
なっかー(@konsent_nakka)

CARTA Engineering

April 05, 2023
Tweet

More Decks by CARTA Engineering

Other Decks in Technology

Transcript

  1. 経営統合してできた会社です。 電通100%子会社の サイバー・コミュニケーションズ(CCI)が 1 東証一部上場企業である VOYAGE GROUP と アドプラットフォーム事業を中心に幅広く事業展開。 テクノロジーや事業開発力が強み。

    デジタル広告のメディアレップ事業を中心に事業展開。 強い顧客基盤が特徴。 【 VOYAGE GROUP 】 【 CCI 】 CARTA HOLDINGSとは ❶ 約53% 電 通 (株) VOYAGE GROUP 約 47% 既存株主 CARTA HOLDINGSは、2019年1月に
  2. 流れ 0. 留意事項 1. そもそもロックとは?どういう時に使うの? 2. ロックのメリット/デメリット 3. 排他ロック、共有ロック 4.

    トランザクション分離レベル 5. ロック範囲の種類 6. デッドロックの例 7. トランザクションをうまく使う方法
  3. 1. そもそもロックとは?どういう時に使うの? ①残高確認 1000円 1000円 0円 ③残高1000円 - 引き出す 1000円

    ②残高確認 1000円 2000円 ④残高1000円 +入金 1000円 システムが残高を確認したタイミングによって ③が反映されなくなる
  4. 1. そもそもロックとは?どういう時に使うの? ①残高確認 1000円 1000円 0円 ③残高1000円 - 引き出す 1000円

    ②残高確認 待機 0円 ④残高0円 +入金 1000円 ロックされている 残高確認 0円 1000円
  5. 共有ロック 排他ロック 共有ロック OK NG 排他ロック NG NG 排他ロック: 基本的には他のSQL実行をブロックするロック

    共有ロック: 排他ロックを取得するようなSQL実行をブロックするが、共有ロックを取得する SQL実行までは許可するロック
  6. ダーティーリード 非リピータブルリード ファントムリード READ UNCOMMITTED 発生 発生 発生 READ COMMITTED

    / 発生 発生 REPEATABLE READ / / 発生(限定的に発生 しない) SERIALIZABLE / / / - ダーティーリード: 別トランザクションでコミットしていない内容を読んでしまう - 非リピータブルリード: 別トランザクションで更新された値が即座に反映されてしまう - ファントムリード: 別トランザクションで追加/削除された値が即座に反映されてしまう
  7. 4.トランザクション分離レベル REPEATABLE READ 更新が別トランザクションでコミットされても分離性を保てる分離レベルです。 InnoDBだとルールが少し特殊で Consistent reads (MVCC) という技術が使われて、ファントム リードが比較的発生しづらいように設計されています。

    consistent readsはそれぞれのトランザクションにおいて最初の読み取り(SELECT)が発生した タイミングでスナップショットを作成し、別のプロセスからデータ追加された場合でもスナッ プショットを読み取るために追加されたデータを読むことありません。
  8. 5.ロック範囲の種類 2. ギャップロック ギャップロックとは言葉では分かりづらいですが範囲ロックと言い換えてもいいでしょう。 WHERE id <= 5とかした時にidが 5以上 のものは範囲的にロックするといったところです。

    INSERTする時に id が 1 のものしか入ってないとして id が 5 のものを入れる時は 1 ~ 5 の範囲 をギャップロックされたりします。 ギャップが被ることによって想定していないブロックが発生することも多くあるので認識はし ておきましょう。 1 2 3 4 5 6 7
  9. 7.トランザクションをうまく使う方法 デッドロックの対処方法 デッドロックに対処するにはいくつかの方法があるので難易度順に並べてみます。 - そのまま失敗させる - リトライ制御をする - そもそもロックが被りづらい処理にする -

    トランザクション粒度を小さくする - ロック時間が短くなるようにする - クエリを見直して適切なロックを取得するようにする - トランザクション分離レベルを変更する
  10. 7.トランザクションをうまく使う方法 トランザクションをうまく使う方法 - サービスにあったトランザクション分離レベルを選択する - まとまったDB操作は同一トランザクションで処理する - 直前とデータが変わってて不整合が起きる - ロック粒度をできる範囲で小さくする

    - それ同じトランザクションに入れる必要ある? - ロック時間、範囲(レコード/ギャップ/ネクストキー ロック)が小さくなるようにする - 重いクエリでロック取りすぎ!不必要に範囲の広いロック取りすぎ! - ロックのMAX待機時間を変更する - InnoDBだとロック待ちのタイムアウトがデフォルト50秒……50秒!?
  11. 8.まとめ - 専有と共有がある - 分離レベルが4つあってInnoDBのデフォルトはREPEATABLE READ - SELECT ~ FOR

    UPDATE などのロック読み取りを上手く活用しよう - 空振りDELETE/UPDATEはするな - トランザクション粒度を小さくしよう
  12. 参考・利用 利用 - SAKURA internetのアイコンセット https://knowledge.sakura.ad.jp/4724/ 参考 - 「失敗から学ぶRDBの正しい歩き方」著者: 曽根

    壮大 さん - https://dev.mysql.com/doc/refman/5.6/ja/innodb-lock-modes.html - https://dev.mysql.com/doc/refman/5.6/ja/innodb-record-level-locks.html - https://dev.mysql.com/doc/refman/8.0/ja/innodb-transaction-isolation-levels.html - https://blog.tiqwab.com/2018/06/10/innodb-locking.html - https://zudoh.com/mysql/research-next-key-lock-and-insert-intention-gap-lock - https://dbstudy.info/files/20140907/mysql_lock_r2.pdf
  13. 告知! • 日時:8/7(月)〜8/25(金) 10:00〜18:30 • 形式:オンライン+渋谷オフィス • 待遇:14万円支給 • 定員:30名程度

    • 対象:25卒で入社可能な方 • Webの体系的な講義 と チーム開発 を 行う圧倒的成長の3週間💪🔥 ”Go言語を使って学ぶ、 価値のあるもの創りとチーム開発” もの創り実践プログラム 「Treasure」