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

トランザクション技術入門

 トランザクション技術入門

サポーターズさんの勉強会でLT発表させていただいた際の資料です

Rikito Taniguchi

September 22, 2017
Tweet

More Decks by Rikito Taniguchi

Other Decks in Programming

Transcript

  1. こんにちは • • id:tanishiking24 • 2017 年 4 月新卒入社 •

    Web アプリケーションエンジニア • 2017 年 3 月までは京都大学工学部情報学科計算機科学コース • 最近の趣味はボルダリングと PUBG 2
  2. トランザクションとは何か トランザクションとは「1 つ以上の連続した操作の単位」 • データベースへの SQL を用いた操作としては SELECT,UPDATE,INSERT,DELETE など •

    アプリケーションとしては複数の操作をもって一つの意 味のある操作となることがあり、その複数のひとまとま りの操作をトランザクションと呼ぼう 5
  3. ACID 特性 トランザクションは ACID 特性を満たすと言われる • Atomicity: 原子性 • Consistency:

    一貫性/整合性 • Isolation: 分離性/独立性 • Durability: 耐久性 7
  4. Atomicity (原子性) 例えば課金用の石を 100 個使って 10 連ガチャを回すロジック • ユーザーの持つ石を 100

    個減らす • ユーザーに課金アイテムを 10 個与える 最初の操作を実行した時点でエラーが起こってしまったら破滅 10
  5. Isolation (分離性または独立性) 制約がゆるすぎると不整合が起こってくる 例: Dirty Read コミットしてない値を読んでしまう trx1 trx2 Read(X)

    - Write(X := X+10) - - Read(X) - Write(X := X-10) COMMIT ROLLBACK trx1 は ROLLBACK されるので、trx2 は本来 X-10 になってるはずだが… 13
  6. Durability • どうやってコミット時に耐障害性を保証するのか • Redo ログへの書き込み (ログ法)(トランザクションで行われた操作 が記録される)(シーケンシャルライト) • システムがクラッシュし再起動した時は

    Redo ログに書き込まれた 内容から整合性のある状態に復元する (ロールフォワード) • 「Redo ログへの書き込み」が必ず「データベース (ディスク) への操 作」に先行することで Redo ログによる整合性を保った状態への復 旧を保証することができる • ログに先に書け! というプロトコルを WAL(Write Ahead Log) という ログは SQL のクエリごとに書き込まれるのではなく log buffer に貯めら れ、定期的 (基本的に COMMIT 時) にディスクに flush される 15
  7. アプリケーションを書くのに必須なのか • 単純なアプリケーションを書くだけなら多分必要ではない (だいた い RDBMS のデフォルト設定がいい感じにしてくれる) • 複雑なアプリケーション (金融系だったりユーザー間のアイテムな

    どのやりとりが多いシステム) だとトランザクションの知識がある と破滅を防げるかも • RDBMS の設定パラメータの意味がわかってくる • トランザクションの知識がミドルウェアの作成に活かせたり (ジョ ブキューシステムとか) • 楽しい (楽しくない?) 16
  8. おすすめ文書 • おうちで学べるデータベースのきほん (翔泳社) • RDBMS 解剖学 よくわかるリレーショナルデータベースの仕組み (翔 泳社)

    • リレーショナルデータベース入門 (サイエンス社) • 一人トランザクション技術アドベントカレンダー • 各種 RDBMS の公式ドキュメント 18