最終更新日: 2026-08-25
TOP(About this memo)) > 一覧(RDB) > 基本概念
標準SQLはISO/IEC 9075「Database Language SQL」という国際規格に準拠しており、ANSIとISOが定めた標準SQLとなっている。
トランザクションシステムの性質として定義された概念。
「守るべき概念」という説明のされ方をすることが多いが、(IMO)それぞれ「ケースバイケース」「トレードオフ」の側面が強いと考えている。
(IMO)このうち一貫性(Consistency)だけは、他の3つと性質が異なると感じている。「あらかじめ与えられた整合性を満たすことを保証する性質」と説明されることが多いが、これはケースバイケースの話ではなく絶対に守るべきルールであり、他の3項目(トレードオフの余地があるもの)とは毛色が違う。
自分の中では、一貫性を「ある処理において何回やっても同じ結果をもたらすこと(冪等性, Idempotency)」と読み替えると理解がしっくりくる。この読み替えだと、たとえば複数のトランザクションをその実行順番によって結果が変わる(=冪等性がない)こと(直列化異常)を許容するケースが多いことも、トレードオフの一種として説明できる。ただしこれは一般的なACIDの定義とは異なる、あくまで個人的な解釈である点に注意。
「BeginTx 〜 Commit(Rollback)」はこのうちどれに当たるかというと、トランザクションである。
できない。
database/sqlでも、リクエストごとに別のコネクションを利用する。あらかじめDBへの接続をプールしておいて、接続時の負荷を軽減する仕組み。
コネクションプールはバックエンド側(例: Goのアプリケーション)で管理されるが、実装上は基本的にサーバーをリセットしない限り、プールに蓄えられているコネクションはcloseされない(?)。
仮にDBへ直接接続するバックエンドが複数存在する場合、それぞれがコネクションプールを持つことになるため、それらの上限を設けて、その合計がDB自体の最大コネクション数を超えないようにする必要がある(?)。もしくは、DBからコネクションを取得する際に上限に達していた場合の振る舞いを精査しておく必要がある(?)。
あるテーブルにN件のデータがあり、別のテーブルから関連データを紐づけて取得するケースを考える。
その場合、素直にSQLを実行すると、N+1回のSQL実行が必要になるという問題。
解決策は主に以下の2つ。
(IMO) 基本的にはEager Loadingの方がアプリケーション側に処理コストを渡せるので、良い選択肢だと考えている。
テーブル、インデックス、シーケンスなどの定義を行う言語。CREATE、DROP、ALTER、TRUNCATE など。
データの検索や登録、削除といった操作を行う言語。SELECT、UPDATE、INSERT、DELETE、EXPLAIN、LOCK TABLE など。
GRANT、REVOKE など。
BEGIN、COMMIT、ROLLBACK など。