データベーススペシャリスト資格|2022年10月挑戦ログ 8月6日|DB基礎知識(同時実行制御)|SQL(確認ドリル)

高度IT・基礎知識

この記事は「データベーススペシャリスト資格に興味はあるが、どのようなものか?どう学ぶのか?」という方向けに、具体的な内容と私自身の挑戦ログをお伝えする。学び中の方や、これから学ぼうとされる方の参考になれば幸いだ。今回は知識およびSQL(確認ドリル)について書く。(SQLはGoogle Big Queryに準拠)

知識(同時実行制御)

独立性と同時実行制御の必要性(おさらい)

  • トランザクションの一貫性・独立性の重要性を示す例として、同時更新が挙げられる。
  • たとえば口座残高が50,000円のとき、100,000円の入金トランザクションと、20,000円の出金トランザクションを同時に動かすとする。
  • ここで同時実行制御がされていないと、入金トランザクションが150,000円と更新したあと、出金トランザクション側が30,000円と上書き更新してしまうロストアップデートが起きてしまう。

同時実行制御の方法

  • それでは、ロストアップデートを防ぐにはどうするか。最もシンプルなのは、入金トランザクションが更新を終えたあとに、出金トランザクションを動かすこと。
  • そのために、入金トランザクションの処理中はロックをかけて、他の作業を排除する(排他制御)を行う
  • しかし、このように一つ一つのトランザクションを順に動かす方法(シリアライズ:直列化)はパフォーマンスが悪い
  • つまり、安全性とパフォーマンスはトレードオフである。

ロックの種類

  • 占有ロックは、更新や書き込み時にかける。占有ロックされている資源には、いかなるロックも重ねてかけることはできない。
  • 共有ロックは、参照する時にかける。共有ロックの重ね掛けはできるが、占有ロックをかけることはできない。(参照中に更新されると困るから)

ロックの粒度

  • 行ロックや表ロックなどがある。ロック範囲は目的に応じて使い分ける。
  • たとえば”社員”表において、№2 タロウさんの住所を書き換えたいとき。更新だからと言って表全体に占有ロックをかけると、他の情報が一切参照できなくなってしまう。
  • よってこのときは、№2 タロウさんの行のみ占有ロックを書けるのが効率的。

2相ロック

  • 複数の資源を更新する場合に、必要な資源をすべてロックしてから更新をおこなうこと。
  • たとえばx,y,zの3の資源を更新するとき、lock(x),lock(y),lock(z)とロックすることを第1相(成長フェーズ)と呼ぶ。
  • unlock(x),unlock(y),unlock(z)と、トランザクション終了時にまとめてロックを開放すること第2相(縮退フェーズ)と呼ぶ。
  • なお、資源xの更新だけが終わったとしても、2相ロックの場合はxの開放は行わない。
  • このように必要な資源を完全に囲い込むことで、他に迷惑はかけるが、整合性を取って目論見通りやりやすくなる。

デッドロック

  • 他のトランザクションの資源開放待ちを互いに行うことによって、トランザクションがこう着状態に陥ること。
  • 一つの資源更新が終わるたびに開放、という方法だと起こらない。しかし、2相ロックのときは起きる。
  • たとえば、トランザクション1が資源aを扱い、資源bのロック開放待ち。トランザクション2が資源bを扱い、資源cのロック開放待ち。トランザクション3が資源cを扱い、資源aのロック開放待ち…とループする場合。
  • 解決するには、いずれかのトランザクションを強制停止し、再実行すればよい。
  • しかし、そもそも発生しないのが望ましい。理屈的には、資源のロック順を合わせれば良い。(ただし、人間のやることなので、現実的には完璧は難しいが)
  • つまり上記例なら、トランザクション3を資源a処理後、資源cを扱う流れ(a→b→c)に沿えば良い。

その他のデッドロックを防ぐ工夫

  • なお、ロックをかけずに、不整合の発生を防ぐ仕組みとして、時刻印アルゴリズムや楽観アルゴリズムがある。
  • デメリットとして、高負荷だとどのトランザクションも終わらなくなるリスクがある。ただ、午前2試験で知識を問われる可能性がある。
  • 考え方は、「先行のトランザクションが、これからアクセスしようとしている資源に、後続のトランザクションが先回してアクセスした場合、先行のトランザクションをロールバックして再実行させる。」ということ。
  • つまり、自分が処理している間に横やりを出されたら、潔く最初からやり直す方法。

9月22日復習時追記

  • ロック、2相ロック、デッドロックは、午前2では数問出題。TACテキストおよび過去5年分解いており、対策済。
  • 午後については「同時実行制御、デッドロック」として過去問ベースで確認しており、対策済。

問題088(SQL確認ドリル)

問題文

  • web_logテーブルに、何日の固有な年月日が記録されているかを調べてください。
  • なお、同一年月日における別日時は、一つとしてカウントします。
  • 結果テーブルのカラム名を「unique_days」とします。

count(distinct 列名),format_datetimeのおさらい

  • count(distinct 列名)は指定した列のユニークな値の数を取得できる。
  • format_datetimeは引数に指定したパラメータで日付を置き換える。今回は年月日なので”%F”を用いる。
  • 具体的には以下のとおり。

考察

  • データベーススペシャリスト資格について。今回は知識(同時実行制御)の復習を行い、処理の一貫性を保つための資源ロック等を学習した。また、SQLの確認ドリル(web_logテーブルにおける固有な年月日の数の調査)を解いた。
  • 考察。子どもの「なぜ?どうして?」には、真摯に答えるようにしている。疑問や好奇心は知的活動の始まりとして重要だと思うからだ。また、自らの思い込みを押し付けないよう、他の意見(辞書の定義や妻の意見など)も取り入れ、わかりやすく伝えようとする努力は、自分の頭のトレーニングにもなる。

考察のシンプル化と英訳(練習中)

  • children’s “why” is good brain training for children and me.
  • (子どもの「なぜ」は、子どもにとっても私にとっても良い脳トレです)

参考資料

  • 集中演習 SQL入門/木田和廣/株式会社インプレス
  • 2022年度版 ALL IN ONE パーフェクトマスター データベーススペシャリスト/TAC

コメント

タイトルとURLをコピーしました