トランザクション管理と排他制御

データベースをみんなで取り扱ってると予想しないことが起きる可能性がある。
データベースの不整合を引き起こさないため、誰も彼もが好き勝手に操作性している限りに操作されると困るので
```トランザクション管理```と```排他制御```がある。

# トランザクションとは処理の塊
```一連の処理のひとまとまり```にしたもの
```トランザクション単位で更新処理を管理```します。
例　商品を選び、カートに入れて、精算するこれをひとまとまりで買い物というみたいなことかな。

# 排他制御とはロックする技
```処理中のデータをロックして、他の人が読み書きできない```ようにする機能。
トランザクションの間、使用するデータをロックしておけば、```誰かが割り込んでデータの不整合が生じたりしない```ようにする。

## ロック方法の種類
### 共有ロック
他のユーザはデータを```読むことはできますが、書くことはできない```。
共有ロックが掛かっているデータには専有ロックはかけられない。

### 専用ロック
他のユーザーはデータを```読むことも、書くこともできない```。
専有ロックが掛かっているデータには専有ロックも共有ロックもかけることができない。

### ロックの注意点
このようにトランザクション中にデータをロックしていると
```複数のトランザクションがお互いに相手の使いたいデータをロック```してしまう。
そうすると
お互いがお互いのロック解除を永遠に待ち続けるという現象が起こる。
これを```デッドロック```という。

### ロック粒度
ロックをかける範囲のことで、```粒度を細かくする```と待ちが減ることで同時に実行できるトランザクションは増えるが、```オーバヘッド時間も増えて処理効率が悪くなる```。
一方```処理能力を荒くする```と同時に実行できる```トランザクションが減るが、処理効率は良くなる```。

#### オーバヘッド時間
コンピューターで、```目的の処理以外のところでかかる時間```。プログラム自体の問題や、ディスクアクセスにかかる時間などが原因で発生する。
出典 https://kotobank.jp/word/%E3%82%AA%E3%83%BC%E3%83%90%E3%83%98%E3%83%83%E3%83%89-12393#:~:text=%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%A7%E3%80%81%E7%9B%AE%E7%9A%84%E3%81%AE%E5%87%A6%E7%90%86,%E3%81%8C%E5%8E%9F%E5%9B%A0%E3%81%A7%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B%E3%80%82

#### 気づき
お互いがロックしてしまうのか。
お互いが複数のデータをロックしてします状況とはなんだろうか？
同じ複数のデータを扱っている時だろうか？
トランザクションを経験していないので一度経験してみたい。

## トランザクションに求められるACID特性
トランザクション処理に対して４つの特性がある。

### Atomicticy(原子性））
トランザクションの処理結果は、```全て実行されるか？全く実行されないか?いづれで終了する```こと。
```中途半端に終了させてならない。```

#### 気づき
絶対完遂するかしないかなのか。

### Consisitency（一貫性)
```データベースの内容が矛盾のない```状態。
トランザクションの結果に```矛盾を生じさせるようなことはなってはならない```。

#### 気づき
一連の処理に矛盾が生じないとはどのようなことだろうか？
表と表の結果が一致しないことか。

### Isolation(隔離性)
複数のトランザクションを同時に実行した場合と、順番に実行した場合の処理結果が一致すること。

排他処理をやって相互に影響しない。
#### 気づき
隔離性がいまいちわからない。
調べてみよう。


#### 隔離性とは？
> ```実行中のトランザクションの中間結果に他のトランザクションがアクセスできない```。
    出典https://qiita.com/kt921112/items/bb64adaa24df823f3c31

> 複数のトランザクションを並行処理した場合でも，
    トランザクションは```同時に処理されている他のトラ
    ンザクションの影響を受けない```
    – 複数のトランザクションの並行処理の結果は，トラ
    ンザクションを```何らかの順序で逐次処理した場合
    と一致しなければならない```
    出典 https://www.db.is.i.nagoya-u.ac.jp/~ishikawa/lectures/db19/12.pdf

ちょっとイメージができないな。

### Durability(耐久性)
トランザクションの```更新結果は、障害が発生してもデータベースから消失しない```こと。
何らかの```復旧手段が保障されている```こと。

## ストアドプロージャ
* 一連の処理手順(SQL文)を一つのプログラムにまとめ、```データベース管理システム（DBMS)側にあらかじめ保存```しておくこと。
    例えばクライアントサーバーシステムにおいて、データベースサーバーに保存んされたストアドプロシージャは、そのプロシージャ名を指定するだけでクライアントから実行させることができます。

* ```データベース管理システム（DBMS）の機能の一つ```で、データベースに対する連続した複数の処理を一つのプログラムにまとめ、データと共に保存できるようにしたもの。```処理はDBMS側で行われ、外部からはクエリを発行する```のと同じ手順で実行できる。

* 頻繁に使うSQL文などの命令群を、サーバ側に格納しておく。即時実行できる。クライアントは短い要求のみ送るのでネットワークの負荷も軽減される。

### メリット
* SQL文をまとめること(プロシージャ)によって```ネットワークの負荷が軽減```できる。
* プロシージャは```SQL文の解析も済ませた即実行可能な形式```

### 気づき
クライアントが使っている応用ソフトウェアからミドルウェアに行って、プロシージャ（SQL文をまとめたもの)でデータベースを扱うのか。
SQL文は解析が必要なのか。（これは時間がかかりそうだ。）

#### クライアントサーバシステムとは？
```サービス（実際の処理）を提供する「サーバ」```と、```サービスをリクエストする「クライアント」```とで役割を分担したシステムのことです。
##### メリット 負荷分散
集中処理システムでは、```１つの汎用機（メインフレーム）に大きな負荷```がかかります。
クライアントサーバシステムであれば、```ユーザリクエストの受付とコンテンツの表示は「クライアント」```が、```「サーバ」側ではコンテンツの準備だけ```行えばOKなので、それぞれ負荷が分散されます。

##### メリット　部分的な故障に強い
もし集中処理システムであれば```１か所でバグが発生した場合、コンピュータのすべての機能を一度停止する必要```が出てくるため、その時間そのコンピュータを利用することができなくなってしまいます。

##### メリット　柔軟なシステム変更に強い
これが集中処理システムの形態をとっていた場合、```一度「クライアント（ブラウザ）」を一時停止```させなければなりません。

分散することによって負荷と故障そしてシステム変更に強い。
出典 https://it-biz.online/it-skills/client-server/

#### データベースサーバとは?
複数のサーバが必要な階層型システム上で、データベース管理システム（※）が稼動するサーバです。

データベースサーバはシステムが取り扱うデータを一元管理し、データの保存や更新、バックアップなどを行います。また、クライアントのリクエストに対してデータ検索や書き換え、削除などの処理を実行し、リクエストに対する結果を返すといった操作を行います。

※データベース管理システム：データベースを構築するために運用・管理を行うシステムやソフトウェアのこと。データマネジメントシステムとも呼ばれる。

##### Webの３層構造が現在の主流
システム構築する際ソフトウェアの機能を３つの階層に分けた３層構造が現在の主流です。システムを構成する３つの階層は以下になります。

* ウェブサーバ
ユーザへの機能の表示や操作の受付などのユーザインターフェイスを実装した階層。
* アプリケーションサーバ
業務などの具体的な処理や手順を実装した階層。データベースサーバとの橋渡しのような機能を担う。
* データベースサーバ
データの記録、読み書きなどを実装した階層。
出典 https://it-trend.jp/database/article/89-0056#chapter-1

データベースサーバーはDBMSが稼働するサーバーになり、3層構造の一つだということがわかった。

# 問題を解いた時の気づき
* 共有ロックはデータ（レコードなど）を読み込むことはできるが、書き込むことはできないのか。
* 占有ロックは読み込み、書き込みが両方ができないのか。

# 出典　
https://gihyo.jp/book/2020/978-4-297-11781-8

https://gihyo.jp/book/2022/978-4-297-12375-8