データベーススペシャリスト

データベーススペシャリスト試験 ACID特性の「I」独立性を解説

ACIDのIに注目

ACIDのIとはIsolation「独立性」です。

トランザクションが他の

トランザクションの影響を受けない

という特性の事です。

ダーティーリードとかファントムリードのお話です。

トランザクションが他のトランザクションの影響を受けないようにするには?

同じ資源を更新する2つのトランザクションを
同時,並列に実行すると干渉しあってしまいます。

例えば,口座の残高照会5万円に対して金額をプラス1万円の処理と

給料の入金20万円の処理が同時に実行された場合,

残高照会5万円とプラス1万円の間で

給料のプラス20万円が実行されたら,

本来25万円に対してプラス1万円で26万円となるところが,

5万円にプラス1万円して6万円になってしまったら

とんでもない話ですよね。

DBMSでは,そんなことにならないような

工夫がされています。

 

トランザクション同士が干渉しなくするには

基本的にはロックをかける必要があります。

先の例でも,プラス1万円とプラス20万円が

直列で順番に処理されていれば26万円になっていたはずです。

だから,並列処理を直列にすればすべては解決します。

 

しかし,日々大量おトランザクションがある中で

誰かが使っている時間は使えないってなると

困ってしまいますよね。

 

この状態をスループットが低下しているいいます。

 

どこまで許容して並列実行させるか

すべて直列にすれば解決するけど

スループットが低下する。

だからどこまで許容しようかって話になります。

分離レベル

その許容はレベル分けされて整理されています。

レベル0

READ UNCOMMITTED

レベル1

READ COMMITTED

レベル2

REPEATABLE READ

レベル3

SERIALIZABLE(シリアライザブル)直列可能の意味

 

レベルが上がるほど不整合は防げるスループットは下がる

ダーティーリード

直訳:汚染された情報を読んでしまう

意味:相手がcommit/rollbackする前のデータを参照する

 

他のトランザクションがコミット前の情報を読み込んでしまう。

そのままコミットされれば問題ないが

ロールバックされた場合は,存在しない値で処理したことになる。

例)T1がと商品代金を100からをから200に変更(コミット前),

T2が商品代金を検索すると200が取得される。

その後T1がロールバックされ,商品代金は再び100になる。

 

これだと商品代金200って一度も

世の中に出ていない値でT2は何らかの処理を

したことになってしまいます。

ノンリピータブルリード

同じ条件で検索しても異なった結果が返却される

一つのトランザクション(T1)のなかで

何かしらループ処理をしていて,

最初に検索した商品代金は100円だったのに

途中から200円になる感じ。

 

原因は他のトランザクション(T2)が200円にしてコミットしたから。

 

この場合,T1の処理が終わってから

商品代金がT2によって書き換えられれば

問題ないが,

T1の同一トランザクションのなかで

検索するたびに値が変わってしまうと

バグの原因となる。

ファジーリードとも言う。

 

ファントムリード

幻影が見える

突然値が発生したように見える

 

これは先のノンリピータブルリードのレコード版です。

先ほどはループ中に値が変更されましたが,

行が追加されてしまうのが

ファントムリードです。

 

ロストアップデート

これまで見てきたような

排他処理を全く行わない場合は

データを消失する可能性がある。

 

例えばサーバー上のエクセルファイルを

ローカルPCにコピーし,

編集する。

再びそのファイルをサーバー上にコピーした場合,

最初にコピーして編集している間に

誰かがそのサーバーのファイルを

更新していた場合は,その更新をすべて

無きものにしてしまいますよね?

 

そのためサーバー上のファイルを開いているときは

誰かが開いているときは読み取り専用でしか

開けないようになっています。

 

こういった更新データを無きものにすることを

ロストアップデートといいます。

SQLやデータベースについてもっと学びたい方は次の記事でおすすめの書籍を紹介しています↓

SQLServerやデータベースに関する書籍のおすすめランキング!SQLをこれからはじめようと思っている人や,普段SQLを使った仕事をしているけどもっと詳しくなりたい!という方向けに,どんな本を読めばい...

<<   1   2   3   4   5   6   7   8   9    10   11   12   >>

トップページへ戻る

BlazorでのWebアプリケーション開発手法2【C#】

Udemyの非売品コース「C#14新機能」という80分の動画レクチャーを
無料でプレゼントしています。
こちらからご覧になってみてください。

A01_はじめに
B01_メッセージを出すレイアウトの作成
B02_pタグを使ったメッセージ表示
B03_ポップアップメッセージを表示する方法
B04_問い合わせメッセージを表示する方法
B05_ユーザーの入力を受けるメッセージ
B06_インラインJavaScript非推奨
B07_Javascriptを分離してアクセスする方法
B08_MessageServiceを作成する
B09_自作Serviceの依存性注入をする方法
C01_EditFormを使った入力検証
C02_ValidationSummary
C03_ValidationMessage
C04_入力コンポーネント_InputText
C05_InputNumber
C06_未入力を許容する方法
C07_InputNumberで対応している型
C08_InputDate
C09_InputSelect
C10_入力コンポーネント_InputCheckbox
C11_InputRadioとInputRadioGroup
C12_InputTextArea
C13_InputFile
C14_ファイルの上限を設定する
C15_フォーカスをあてる方法_標準編_ElementReference
C16_フォーカスをあてる方法_Razorコンポーネント編
D01_StringLength
D02_RegularExpression_正規表現
D03_EmailAddress
D04_Compare
D05_ViewModelに分ける方法
D06_依存性注入を利用したViewModelの生成
D07_CustomValidation1
D08_CustomValidation2
D09_プロパティレベルのCustomValidation
D10_ValidationContext
D11_処理をViewModelに移す書き方
D12_ViewModelに移せないロジック
D14_ShouldRender
D15_ViewModelに書かないほうがいいもの
D16_エラー箇所にフォーカスを当てる方法
E01_Azureにデプロイするための事前作業
E02_Azureにアップするアプリの作成
E03_Azureへの公開準備
E04_Azureへの公開
E05_データベースの作成
E06_データベースのデータを取得する
E07_データベースの値を画面に表示する
E08_Azureのデータベースを作成する
E09_Azureのデータベースにポータルサイトからログインする
E10_AzureのDBにテーブルを作成する
E11_BlazorアプリからAzureDBに接続する
E12_SQLデータベース料金の注意
E13_AzureSQLデータベースの無料オファーを受ける
F01_依存性注入のライフサイクル
F02_クラウドでのAddSingletonの動き

Udemyの非売品コース「C#14新機能」という80分の動画レクチャーを
無料でプレゼントしています。
こちらからご覧になってみてください。