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

データベーススペシャリスト試験 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アプリケーション開発手法1【C#】

A01_はじめに
A02_バージョンの確認
A03_プロジェクトの作成
A04_アプリの実行
A05_サンプルプログラムの構成
A06_Razorコンポーネント
A07_Razor構文
A08_@pageでURLを指定する
A09_@rendermode
A10_PageTitle
A11_HTMLの見出し
A12_pタグ
A13_単方向データバインド
A14_単方向データバインドの詳細
A15_Bootstrap
A16_ボタンクリックイベント
A17_イベント引数の受け取り方
A18_ここまでのまとめ
B01_新しいWebページを追加する方法
B02_サイドバーから画面を表示する
B03_サイドバーのアイコンを変更する方法
B04_計測値を表示する
B05_変数に置き換える
B06_最新の値でデータを更新する
B07_@usingで通常のC#コードを呼び出す
B08_画面遷移_aタグ
B09_画面遷移_aタグの見た目をボタンにする
B10_画面遷移_NavigationManagerでの遷移
B11_画面間のパラメータの受け渡し方法
B12_EscapeDataStringでエスケープする
B13_複数のパラメータを渡す
B14_任意のパラメータにする
B15_string以外の型をパラメータで使う方法
B16_DateTime型をパラメータで渡す方法
B17_引数2個のURLも型指定に変更する
B18_パラメータ属性をつけるときの注意点
B19_OnParametersSet
B20_OnInitialized
B21_OnInitializedが2回通る問題の対応
B22_ブラウザが開いている間の値を記憶する方法
B23_値の受け渡しとしてのProtectedSessionStorage
B24_非同期を想定したUIの制御
C01_一覧表示
C02_非同期での一覧表示
C03_table-striped
D01_入力エリア
D02_双方向データバインド
D03_入力データをリアルタイムで通知する方法
D04_placeholder
D05_入力エリアの横幅の調整
D06_テキストチェンジイベントを拾う方法
D07_プルダウン
D08_プルダウンのbootstrap
D09_プルダウンの選択している値をデータバインドで操作する
D10_プルダウンにリストの値を表示する
D11_プルダウンに未選択行を入れる
D12_プルダウンの入力を禁止する
D13_プルダウンのチェンジイベントを取得する
D14_チェックボックス
D15_チェックボックスにラベルを付ける
D16_複数のチェックボックスを並べる
D17_ラジオボタン
D18_ラジオボタンのデータバインド
D19_ラジオボタンのチェンジイベント
D20_ラジオボタンにbootstrapを適応する