メインコンテンツにスキップ
モジュール 11 · レッスン 4 / 4コース内の 44/57~12 min
モジュールのレッスン (4/4)

分離レベル

明示的な FOR UPDATE 以外にも、トランザクションには、デフォルトで個々のインタラクションを分離するためにどれだけのエネルギーを費やすかを制御する、エンジンの奥深くに組み込まれた生来の数学的ルールもあります。 これは 分離レベル と呼ばれます。 SQL の世界では、パワーと安全性の順に 4 つの標準的なものが知られていますが、パフォーマンスの点では明らかにその逆です。

  • READ UNCOMMITTED: 無秩序な狂気、あなたのトランザクションは、自分のスクリプトの途中で人々からの一時データを含む、他の人によって行われたすべての変更を見ることになります。ダーティ リード エラーが絶えず発生するため、大規模な DB では誰もこれを使用しません。
  • READ COMMITTED: (Postgres のデフォルト)。サードパーティが COMMIT を発行するとすぐに新しいデータが表示されますが、ファントム読み取り (長いワークフローの途中で新しいレコードが表示される) や非線形の一貫したビューの犠牲になる可能性があります。
  • REPEATABLE READ: 重くなりました。あなたの大きな時間枠のセッションの間、私のクエリが開始された瞬間にデータベースがフリーズし、他の人が完了した公式コミットさえも完全に無視して無視しているのが「見えます」。魔法のように現れる記録から保護し、安定性を保証します。
  • SERIALIZABLE: 神層 (超遅い)。重複するすべてのトランザクションをブロックして単一レーンで連続して実行することで処理し、衝突するトランザクションを容赦なく中止し、わずかな衝突の科学的可能性さえも根本から排除し、高スループットの確実な 90% を犠牲にします。

どのように設定しますか?

通常の BEGIN; の代わりに、次のように入力します。

SQL
BEGIN ISOLATION LEVEL SERIALIZABLE;

-- and you proceed normally with your hermetically sealed isolation
UPDATE products SET stock = 10;
COMMIT;

または、一部のバリアントや古いエンジンでは、起動後にそれを割り当てます。

SQL
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

自分で試してみてください

運動#sql.m11.l4.e1
試行回数: 0読み込み中…

クエリの有効期間中のグローバル レベルを REPEATABLE READ に正式に設定してトランザクションを開始し、凍結された保護された交換を作成します。\nクエリ レベルでは、その後に何かが続かない限り何の役にも立たないことに注意してください。そのため、空で「COMMIT」で閉じてください。

エディターを読み込み中…
ヒントを表示

BEGIN ISOLATION LEVEL REPEATABLE READ で開きます。そしてCOMMITで閉じます。

3 回の試行後に解決策が利用可能になります

運動#sql.m11.l4.e2
試行回数: 0読み込み中…

クレイジーなシリアル化可能レベルを試して、架空のデータを挿入してみましょう。\n'SERIALIZABLE' ブロックを開きます。\nカテゴリ Id=2 の名前を 'Nuovo Nome Segreto' に更新します。\n最後のアトミックなコミットを実行します。

エディターを読み込み中…
ヒントを表示

シリアル化可能な分離レベルを開始します;\nカテゴリーを更新します SET name = 'Nuovo Nome Segreto' WHERE id = 2;\nCOMMIT;

3 回の試行後に解決策が利用可能になります