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やデータベースについてもっと学びたい方は次の記事でおすすめの書籍を紹介しています↓
#01_はじめに
#02_VisualStudio2022のインストール
#03_SQLServerのインストール
#04_データベースとテーブルの作成
#05_プロジェクトの作成
#06_接続先文字列の作成
#07_データテーブルでのデータの取得
#08_Sqlアクセスクラスの作成
#09_SqlDataReaderでのデータ取得
#10_SqlDataReaderの結果をカスタムクラスに入れる方法
#11_SqlCommandでInsert文を発行する方法
#12_SqlCommandでUpdate文を発行する方法
#13_Update対象がなかったらInsertする方法
#14_SqlCommandでDelete文を発行する方法
#15_Dapperでデータを取得する方法
#16_DapperでInsert文を発行する方法
#17_EntityFrameworkをインストールしてDbContextを作成する方法
#18_EntityFrameworkでデータを取得する方法
#19_EntityFrameworkでInsert文を発行する方法
#20_EntityFrameworkでUpdate文を発行する方法
#21_EntityFrameworkでDelete文を発行する方法
#22_Helperクラスを作ってSqlCommand操作を共通化する方法
#23_パフォーマンスチェックの方法
#24_4つのデータのとり方のパフォーマンスチェック
#25_4つの結果を踏まえて講評
#26_さいごに
下記URLは、ベネッセが提供する教育用プラットフォームにて
私が公開しているプログラミング学習コースです。
無料コースもあるので、よかったらご覧になってみてください。
【無料動画】「C#を勉強する順番」