データベースのトランザクション処理について

f:id:ryoutaku_jo:20190310174718p:plain

【結論】
トランザクションとは、データベースに対する
 複数の処理(SQL文によるデータ処理)を、
 一つにまとめた処理の事

・複数のSQL文による処理を個々に実行すると、
 初めの処理でエラーが発生していても、
 次の処理を行うなどして、データの整合性が保てなくなる

・関連する一連の処理を、一つの処理にまとめることで、
 途中でエラーが発生した場合、全ての処理を実行しない様に
 するなどして、データの整合性を保つ事が出来る


【目次】

【本題】

トランザクションとは

データベースに対する二つ以上の処理(SQL文による処理)を、
一つにまとめた処理の事を指します。

よく例に出されるのは、銀行の振り込みの処理です。
銀行の口座間の振り込みは、簡単にまとめると下記の流れで処理されます。

 処理1:振り込み元の口座の残高を、出金額だけ減らす(出金処理)
 ↓
 処理2:振り込み先の口座の残高を、出金額だけ増やす(入金処理)

上記の処理は、ユーザー側には一つの処理に見えますが、
実際にはそれぞれ別々のSQL文による処理です。

これらは、一つのSQL文に処理をまとめる事が出来ません。
しかし、それぞれ別々に処理を行うと、データの整合性が保てなくなります。

具体的に言うと、もし入金処理でエラーが発生場合、
振り込み先の残高は増えていないのに、
振り込み元の残高が減ってしまうという、
ユーザーに不利益を与える致命的な問題に発展してしまいます。

そこで登場するのが、トランザクションです。

トランザクションによって、複数のSQL文での処理を、
一つの処理としてまとめる事が出来ます。

それにより、途中の処理でエラーが発生すれば、
全ての処理を実行せずに完了させるという条件を組み込めます。
これにより、データの整合性が保たれ、正しく処理が行えられます。

トランザクションが必要な場面

先ほど述べた様な、個々の処理が独立していた場合に、
データの整合性に問題が発生する可能性がある場合、
トランザクション処理が必要になります。

他に例を出すと、フリマサイトでの退会処理があります。

 
 処理1:ユーザーデータを削除する(退会処理)
 ↓
 処理2:退会したユーザーが出品中の商品データを削除する(商品削除処理)


こちらも、もし個々の処理が独立していると、
退会したユーザーの商品が出品されたまま残り続ける
といった問題に発展する可能性があります。

ACID特性

トランザクションに必要な要素として、
ACID特性というものがあります。

・Atomicity(原子性)
全ての処理が完了するか?一切実行しないか?のどちらかで終了する。
処理が中途半端な状態で終わるという事が内容にする

・Consistency(一貫性)
常に整合性が保たれた状態にする

・Isolation(隔離性)
実行途中の状態が、他に影響を与えない様にする
複数のトランザクションを同時実行した場合と
逐次実行した場合で、処理結果が変化しない

・Durability(永続性)
トランザクション正常終了後は、データベースからデータが消えたり
内容が変化する事が無い様にする。

Railsでのトランザクション

Railsでは、transactionメソッドが用意されており、
それでトランザクションを実装する事が可能です

railsdoc.com


《今日の学習進捗(3年以内に10000時間に向けて)》

就活。

学習開始からの期間 :92日
今日までの合計時間:891h
一日あたりの平均学習時間:9.7h
今日までに到達すべき目標時間:840h
目標との解離:51h
「10,000時間」まで、

残り・・・「9109時間!」