DBMSとは,データベースと
それを扱うソフトウエアの事です。
データベースはそれをためておく場所
MSはマネージメントシステムなので
データベースを扱うソフトウェアになります。
DBMS
目的
データベースには次のような役割があります。
整合性の維持
ここがメインの役割。
性能維持
スループット向上
応答時間短縮
セキュリティ維持
アクセス権の管理
ユーザー承認
機能
同時実行制御→コミットメント制御
障害回復制御→最適化,索引などの機能など
トランザクション
トランザクションとは,途中で処理の流れを中断すると
意味を持たなくなる一連の処理のまとまり
例)銀行口座の振込処理。
AさんがBさんに1万円振り込んだ場合
Aさんの口座から1万円減らす処理と
Bさんの口座に1万円を増やす処理を同時に
やらないといけないが,どうしてもタイムラグが出る。
どちらかが失敗した場合は
どちらもキャンセルする必要がある。
トランザクションが持つべき特性
トランザクションにはACID特性というものを持っている。
Atomicity 原始性
すべて成功するか,すべてなかったことにするかの
どちらかにするという事。
コミットもしくはロールバックを行う。
Consistency 一貫性
矛盾をおこさない。
Isolation 独立性
他のトランザクションの影響を受けない
銀行の例だと,同時に振り込みや
入金を行っても,1つずつの処理を
単体で行ったときと同じように
正しい結果にならなければならない。
Durability 持続性
一旦コミットして登録されたデータは,
障害などの発生によって消失することはない
という特性。
同時実行制御
同時実行制御の必要性
同時に処理が行われた場合に
おかしな動きにならないようにする必要がある。
残高5万円の銀行口座に
給料が20万円振り込まれたのと同時に
1万円を引き出したら,
結果的に残高が4万円となっていては大変です。
正しく24万円になっていないと困りますよね。
DBMSではそれを制御する機能が備わっています。
排他制御
ロックをかけるという事。
ロックには次のような種類があります。
共有ロック
- データを読む(参照)するときにかける
- 複数のトランザクションが1つの資源に
共有ロックをかけることが可能 - 共有ロック中はデータの書き込み更新はできない
- 読み込みは複数個所から可能
- 共有ロックがかかっている資源に対して
占有ロックはかけられない
占有ロック
- データの書き込み時にかける
- ただ1つのトランザクションだけが
1つの資源に占有ロックをかけられる - 占有ロック中は,他から占有ロックも
共有ロックもかけるはできない
ロックの粒度
ロックの粒度とはロックを掛ける排他資源の大きさの事。
粒度(大)
大きな単位でロックするという事。
整合性は保ちやすいが
ロック待ちが発生しやすく
スループットが低下する。
粒度(小)
整合性を保つのに処理が複雑になるが
スループットは向上する。
粒度のレベル
DBごとロック
表ロック
- ロックにかかるオーバーヘッドが少ない
- 粒度が大きく
スループットが低下する - 整合性は保ちやすい
行ロック
- ロックにかかるオーバーヘッドが多い
- 粒度が小さくスループットが
低下しづらい - 整合性は保ちづらくなる
デッドロック
デッドロックとはお互いがロック待ちになって
一生処理が終わらない状態。
例えば「受注情報」と「顧客情報」の値を
変更してコミットする場合,
トランザクションAが
「受注情報」をロックして値を更新,次に
「顧客情報」をロックしようとしたら
他のトランザックしょんがロックしていたので
解除待ちをする。
トランザクションBが
「顧客情報」をロックして値を更新,次に
「受注情報」をロックしようとしたらトランザクションAが
ロックしていたのでロック待ちをする。
トランザクションAはBの開放待ち,
BはAの開放待ちで,永遠にどちらのロックも
解除されません。
これをデッドロックといいます。
デッドロックの解消法
仕方がないので,どちらかのトランザクションを
強制的に終了させます。
そうすればロック待ちがなくなるので
処理は動き出します。
もちろん,強制終了した処理は
もう一度実行させなければいけません。
デッドロックの発生を防ぐには?
デッドロックの発生を防ぐ方法としては
各テーブルにアクセスする順番を
設計時に決めておく必要があります。
先の例では「受注」と「顧客」のテーブルを
更新する際に,順番が逆になっていたのが原因です。
トランザクションAもBも,
受注を更新してから顧客を更新するという
順番で処理していれば,今回のデッドロックは
発生しませんでした。
設計時に,テーブル更新順序というものを
決めておくのSEの仕事といえます。
SQLやデータベースについてもっと学びたい方は次の記事でおすすめの書籍を紹介しています↓
■非公開コース「C#14新機能」プレゼント:
非公開コース「C#14新機能」(80分)をご覧になりたい方は
こちらからURLとパスワードを発行していますので、ご覧になってみてください。
非公開コース「C#14新機能」を観る
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の動き
■非公開コース「C#14新機能」プレゼント:
非公開コース「C#14新機能」(80分)をご覧になりたい方は
こちらからURLとパスワードを発行していますので、ご覧になってみてください。
非公開コース「C#14新機能」を観る