Tech it Easyhttps://techiteasyapp.comWed, 12 Mar 2025 13:59:43 +0000jahourly1DBの各リード現象について調べてみたhttps://techiteasyapp.com/?p=27https://techiteasyapp.com/?p=27#respondWed, 12 Mar 2025 13:59:43 +0000https://techiteasyapp.com/?p=27はじめに

DB について調べていたら、リード現象というものがあることを知りました。リード現象にはいくつかの種類があるようなので、それについて調べてみました。将来の自分のためにもまとめておきます。

ダーティーリード

ダーティーリードとは、あるトランザクションによって変更されたまだコミットされていないデータを他のトランザクションが読み取ってしまう現象のことです。

実際に動かして確認してみます。

DBの初期状態は以下のような状態です。
今回はid = 10のレコードを更新して確認してみるます。

まずはトランザクションAでクエリを発行して、状態を確認してみます。

次にトランザクションBでid = 10のレコードに更新をかけます。その後に、select文で確認してみると当然ですが変更されたことが確認できます。

これをcommitする前に、トランザクションAで再度select文で確認してみましょう。

するとなんと、まだcommitする前なのにも関わらず変更が確認できてしまいます。
これがダーティーリードです。

ファジーリード(ノンリピータブルリード)

ファジーリード(ノンリピータブルリード)とは、あるトランザクションによって変更された(コミットされた)データを他のトランザクションが参照できてしまう現象のことです。

これも実際の動かして確認してみます。(DBの初期状態はダーティーリードと一緒です。)

まずはトランザクションAでid = 10のレコードを確認してみます。

次にトランザクションBでid = 10のレコードを更新してコミットします。
select文で確認してみると、当然変更は反映されていることが確認できます。

次にトランザクションAから確認してみるとどうでしょうか。

まだrollbackを実行していないのにトランザクションBで反映した変更が確認できてしまいます。

これがファジーリードです。

ファントムリード

ファントムリードとは、あるトランザションによって新規作成、または削除されたデータが他のトランザクションによって参照できてしまう現象のことです。

これも実際に動かして確認してみます。

まずはトランザクションAでusersテーブルの状態を確認しておきます。

次にトランザクションBで新しいレコードをinsertしてみます。
commitをして、select文で新規作成の反映を確認してみます。

そして、トランザクションAから再度select文を実行してみます。

先ほどトランザクションBで新規作成したレコードがトランザクションAからも確認できます。

これがファントムリードです。

トランザクション分離レベル

それぞれの現象はトランザクション分離レベルによって制御することができます。
以下が対照表です。

分離レベルダーティリードファジーリードファントムリードパフォーマンス
READ UNCOMMITTED発生する発生する発生する⭐⭐⭐⭐(最速 / ロックなし)
READ COMMITTED発生しない発生する発生する ⭐⭐⭐(早い / 読み取りの整合性のためのロック)
REPEATABLE READ発生しない発生しない発生する⭐⭐(中程度 / 行単位のロックで更新をブロック)
SERIALIZABLE発生しない発生しない発生しない⭐(遅い / テーブルロックレベルの厳しい制御)

レベルを下げるデメリット

表をご覧いただければわかると思うのですが、各現象が起こらないようにするとパフォーマンスに影響が出てしまいます。

まとめ

この記事ではDBにおける各リード現象をまとめました。

どのような用途で使用されいているのか、ビジネス要件などでどのトランザクション分離レベルを設定するのかは変わってくると思いますが、適切なものを選べるようになりたいです。

]]>
https://techiteasyapp.com/?feed=rss2&p=270
dockerの不要なイメージを削除する方法https://techiteasyapp.com/?p=40https://techiteasyapp.com/?p=40#respondSat, 22 Feb 2025 09:45:12 +0000https://techiteasyapp.com/?p=40dockerをローカル開発で使用していると、意外と容量を食っていることに気がつきました。

dockerで使用していないimageを削除する方法をご紹介します。

手順

以下のコマンドを実行します

Terminal
$ docker image prune

–filterオプションを指定すれば使用期限を条件に追加することも可能です。

Terminal
$ docker image prune --filter "until=24h" -- 24時間以内に使用されていないイメージを削除

また、volumeやdocker networkも削除することができます

Terminal
$ docker volume prune
Terminal
$ docker network prune
]]>
https://techiteasyapp.com/?feed=rss2&p=400
terraformのインストール方法https://techiteasyapp.com/?p=33Wed, 05 Feb 2025 10:22:18 +0000https://techiteasyapp.com/?p=33サーバーサイドエンジニアのぱしぃもんです。
趣味でインフラを勉強しようと思い、ローカルにterraformをインストールしたのでその手順をこちらの記事でメモしておきます。

環境

  • macbook pro, M1, 2020
  • mac OS sequoia 15.2

手順

以下のコマンドを実行するだけです。

Terminal
$ brew install hashicorp/tap/terraform

以下のコマンドを実行して、バージョンが出力されれば無事成功です。

Terminal
$ terraform --version
Terraform v1.10.5
on darwin_arm64

]]>