トランザクションとACID

luagate/transaction-acid-introトランザクション入門23データベース・SQL

上から下へ、全 23 枚そのまま並べています。

発表モードで開く

トランザクション入門

トランザクションとACID

矛盾なく処理する 〜全部か無か〜

1
1

目次

今日の流れ

1. 途中で失敗したら困ること

2. トランザクションとは

3. ACID特性

4. コミット・ロールバックとロック

5. まとめと振り返り

2
2
トランザクション入門 - イントロ

今日のゴール

この時間で身につけてほしいことです。

  • 途中で失敗すると何が困るかが分かる
  • トランザクションが「全部か無か」だと分かる
  • ACIDの4つの性質をイメージできる
  • コミットとロールバックの違いが分かる
  • ロックとデッドラックのさわりに触れる
10
3
トランザクション入門 - イントロ

途中で失敗したら?

複数の処理を続けて行う途中で止まると、片方だけ進んだ中途半端な状態が残ってしまいます。

  • 銀行振込はお金を引いて、相手に足す2手順
  • 引いた直後に止まるとお金が消える
  • 逆に足した直後に止まると勝手に増える
  • 片方だけ成功した状態がいちばん危ない
  • だから「全部か無か」で扱いたい
11
4
トランザクション入門 - イントロ

トランザクション とは

いくつかの処理を1つのまとまりとして扱い、全部成功するか、まったく行わなかったことにするしくみです。

トランザクション(Transaction)

複数のデータ操作を1つのまとまりとして扱う単位。すべて成功したときだけ結果を確定し、途中で失敗したらすべて無かったことに戻す。中途半端な状態を残さない。

複数の処理を1つの束にする

全部成功して初めて確定する

途中で失敗したら全部取り消す

中途半端な状態を残さない

12
5
トランザクション入門 - イントロ

銀行振込の例

振込は「引く」と「足す」がワンセット。どちらか片方だけ、は許されません。

1. 始まり

振込の処理をひとまとまりとして開始する

2. 引く

送る人の残高からお金を引く

3. 足す

受け取る人の残高にお金を足す

4. 確定か取り消し

両方成功なら確定、失敗なら両方とも元に戻す

13
6

トランザクション入門 - ACID

2

第2部 ACID特性

安全な処理を支える4つの性質

20
7
トランザクション入門 - ACID

ACID とは

トランザクションが安全であるために満たすべき、4つの性質の頭文字をまとめた言葉です。

ACID特性

トランザクションを信頼して使うための4つの性質。原子性・一貫性・独立性(分離性とも呼ぶ)・耐久性の頭文字を取った呼び名で、これらが守られることで矛盾のない処理が保証される。

原子性は全部か無か

一貫性はルールを壊さない

独立性(分離性)は互いに干渉しない

耐久性は確定したら消えない

21
8
トランザクション入門 - ACID

ACIDの4特性

4つの性質それぞれが、どんなトラブルを防いでいるかを並べます。

意味
防ぐトラブル

原子性

全部成功か全部取り消し

片方だけ進んだ中途半端

一貫性

決めたルールを必ず守る

残高がマイナスになる矛盾

独立性

同時処理が互いに干渉しない

他人の途中結果が混ざる

耐久性

確定したら消えない

停電や故障で消える

22
9
トランザクション入門 - ACID

原子性(全部か無か)

ACIDの中心となる考え方で、処理を分割できない1つのかたまりとして扱います。

原子性(Atomicity)

トランザクション内の処理は、すべて成功するか、まったく実行しなかったかのどちらかになる性質。途中まで成功して止まる、という中途半端な状態を許さない。

それ以上分けられない1つのかたまり

途中で失敗したら全部取り消す

成功するのは全部そろったときだけ

振込で片方だけ進む事故を防ぐ

23
10
トランザクション入門 - ACID

残りの3つの性質

一貫性・独立性・耐久性が、それぞれ別の角度から安全を支えます。

一貫性
  • 決めたルールを必ず守る
  • 残高や在庫が矛盾しない
独立性
  • 同時に動いても干渉しない
  • 他人の途中結果が見えない
耐久性
  • 確定した結果は残り続ける
  • 停電や故障でも消えない
24
11

トランザクション入門 - 確定

3

第3部 確定と取り消し

コミットとロールバック

30
12
トランザクション入門 - 確定

コミット と ロールバック

処理の最後に、結果を確定するか、なかったことにするかを選びます。

ロールバック(取り消し)

  • 途中で失敗したとき選ぶ
  • 変更をすべて元に戻す
  • 中途半端な結果を残さない
  • 始める前の状態に戻る

コミット(確定)

  • 全部成功したとき選ぶ
  • 変更を正式に確定する
  • 確定後は耐久性で守られる
  • 以後はその結果が残り続ける
31
13
トランザクション入門 - 確定

トランザクションの流れ

開始から確定または取り消しまで、決まった流れで進みます。

トランザクションを開始する
複数の処理を順に実行する
すべて成功すればコミットで確定
どこかで失敗すればロールバックで全部取り消し
32
14
トランザクション入門 - 確定

確定までのデータの流れ

処理の途中はまだ仮の状態で、コミットして初めてデータベースに正式に書き込まれます。

  • 開始から確定までは仮の状態として進む
  • 途中の変更はまだ確定していない
  • コミットすると正式に書き込まれる
  • 失敗時はロールバックで仮の変更を捨てる
  • 確定後は耐久性で守られ消えない
33
15

トランザクション入門 - 同時実行

4

第4部 同時実行の制御

ロックとデッドロック

40
16
トランザクション入門 - 同時実行

排他制御(ロック)

同じデータを複数の処理が同時に触って混乱しないよう、一時的に鍵をかけるしくみです。

ロック(排他制御)

あるトランザクションがデータを操作している間、他のトランザクションがそこを触れないように一時的に制限するしくみ。同時更新による食い違いを防ぐ。

操作中のデータに一時的な鍵をかける

他の処理は鍵が外れるまで待つ

同時更新の食い違いを防ぐ

以前学んだ独立性を支える仕組み

41
17
トランザクション入門 - 同時実行

デッドロックのさわり

2つの処理がお互いの鍵を待ち合って、どちらも進めなくなる状態です。

デッドロック

2つ以上のトランザクションが、互いに相手が握っているデータの解放を待ち続け、永遠に進めなくなる状態。データベースが片方を強制的に取り消して解消することが多い。

互いに相手の鍵を待ち合う

どちらも先に進めなくなる

譲り合えない行き詰まりの状態

片方を取り消して解消することが多い

42
18
トランザクション入門 - 同時実行

同時アクセス時の待ち時間(イメージ)

同じデータを同時に触る処理が増えるほど、ロック待ちで時間がかかりやすくなります。あくまでイメージです。

20 相対的な待ち時間1612840
1相対的な待ち時間
5相対的な待ち時間
18相対的な待ち時間
1人だけ
数人が同時
大勢が同時

出典: 同時アクセス数と待ち時間の傾向を示す概念図(概算)

43
19
トランザクション入門 - まとめ
クイズ

振り返りクイズ

今日の内容を確認しましょう。

トランザクションの「原子性」が保証することはどれ?

A
処理を必ず速く終える
B
全部成功か全部取り消しのどちらかになる
C
データを暗号化する
D
複数人の同時利用を禁止する
50
20
トランザクション入門 - まとめ
答え

振り返りクイズ 解答

トランザクションの「原子性」が保証することはどれ?

A
処理を必ず速く終える
B
全部成功か全部取り消しのどちらかになる
C
データを暗号化する
D
複数人の同時利用を禁止する

原子性は「全部か無か」を保証する性質です。トランザクション内の処理はすべて成功して確定するか、まったく行わなかったことになるかのどちらかで、途中だけ進んだ中途半端な状態を残しません。速さや暗号化、同時利用の禁止とは別の役割です。

51
21
トランザクション入門 - まとめ

質疑・次回予告

今日のまとめと、次に学ぶテーマです。質問があればここで受け付けます。

今日のおさらい
  • トランザクションは全部か無かの束
  • ACIDの4性質が安全を支える
  • コミットで確定、ロールバックで取り消し
次回予告
  • NoSQLの種類 〜RDB以外の選択肢〜
  • 表以外でデータを持つしくみを学ぶ
52
22
"

トランザクションは「全部か無か」の約束。途中で倒れても中途半端を残さず、ACIDの4つの性質がデータの正しさを守る。だからこそ、私たちは安心してお金やデータを預けられます。

トランザクション入門

53
23