最近DBを初歩から学び直しているのでその中でトランザクションとは何か、今一度改めて勉強したのでメモをここに残しておきます。
自分は就職して、仕事を始めてからDBを触り始めた。
DBを触るようになって基本的な構文とかはググりながらなんとか覚えたけど先輩とかが話をしている中でどうしても謎だったのが「コミット」「ロールバック」「トランザクション」だった。
「何を言っているんだろう?どういう意味!?」って感じで最初よくわかってないない状態だった。
そんな自分のような「コミット」「ロールバック」「トランザクション」を謎に感じている新人エンジニアにとって、この記事が参考になればと思います
トランザクションとは?
トランザクションとは簡単にいえば「データベースに対して行われる1つ以上の更新処理」のこと。
トランザクションによってデータ更新処理の確定や取り消しを管理できる。便利。
トランザクションの作成は?
トランザクションを使用する場合は開始文を最初に宣言してから、各SQL文を書きます。そして、処理の最後にそのトランザクションを確定、または取り消す終了文を書きます。
START TRANSACTION;
UPDATE SAMPLE_TABLE
SET NAME = 'ABC'
WHERE ID = 1;
UPDATE SAMPLE_TABLE
SET NAME = 'EFG'
WHERE ID = 2;
COMMIT;
上の例では2つの更新処理をトランザクションで処理しています。
開始文はSTART TRANSACTION;
であり、処理を確定させるために最後にCOMMIT;
を宣言しています。
COMMIT
COMMITはトランザクションを確定させる処理です。
一度COMMITした結果は元に戻すことはできないので注意が必要です。
特にDELETE文などをCOMMITする場合、大切なデータを消去していないか確認したほうがよろしいと思います
ROLLBACK
ROLLBACKはトランザクションを取り消す処理です。
ROLLBACKした場合、データベースはトランザクション開始前の状態に戻ります。
ACID特性
トランザクションには4つの特性が標準規格によって決められています。
これらは「ACID特性」と呼ばれます。
原子性(Atomicity)
トランザクションが終わった時に、そこに含まれていた更新処理は全て実行されるか、全て実行されない状態で終わることを保証する性質。
COMMITで更新が確定されるか、ROLLBACKで元に戻されるかの二択というイメージです。
一貫性(Consistency)
トランザクションに含まれる処理はそれぞれの制約を満たすという性質。
トランザクションの途中で制約違反の処理があった場合、処理を中断してトランザクション実行前に戻すことでデータの一貫性が保たれる。そのため、あるデータは更新されているが、その他のデータは更新されないというような状態を持たないということ。
独立性(Isolation)
あるトランザクションが実行中の場合、もう一方のその他のトランザクションの影響を受けないという性質。
トランザクション実行中に、その他のトランザクションがデータの更新を行ったとしても実行中のトランザクションはその更新結果の影響を受けないというイメージ。
永続性(Durability)
トランザクションが完了した後、そのデータ状態が保存され失われることは無いという性質。
この性質の保証のために、一般的にはトランザクションのログを記録しておき、障害が起きた場合はログを使用して障害発生前の状態に復旧する。