トランザクションとは?
トランザクションとは、途中で分けられない処理の流れの単位のことです。
トランザクションは、通常、複数の処理から構成されています。
身近なトランザクションの例
よくわからないな。例えば?
トランザクションの典型的な例として、銀行の預金口座から現金を引き出す処理が挙げられます。
ATMから現金5万円を引き出す時、次の流れで行います。
②引き出す5万円を減額する →10-5=残高5万円
③残高を5万円に書き換える
この①〜③の処理は、分けることなく、最後まで実施しなければATMからお金を引き出すことができません。
例えば、処理が②で終わってしまったら、「口座残高は減らなかったけど、お金が引き出せちゃった!」ということになってしまうね。
こういったことにならないように、①〜③をまとめて出金トランザクションとまとめてしまいます。
トランザクションを使う目的
トランザクションで管理する理由は、一連の処理が一つでも失敗した場合、簡単に処理前の状態に戻せるからです。
処理を1まとまりに束ねているから、まるっと戻すことができるってわけだね!
トランザクションの落とし穴
トランザクションのデメリットは、長いトランザクションの場合は戻す時間が長くなってしまうことです。
長時間処理が終了しないから、他の処理が進まない!なんてことにならないようにデータベース設計をしなければなりません。
ACID特性とは
トランザクションの特性を、ACID特性と呼びます。
ACIDは、4つの特性の頭文字をとった文字です。
C:Consistency(一貫性)
I:Isolation(独立性、隔離性)
D:Durability(耐久性)
Atomicity(原子性)
原子性とは、トランザクションは「全て実行されるか」か、「まったく実行されない」かのどちらかの状態になるという特性です。
ALL OR NOTHINGとも呼ばれます。
中途半端な状態で処理を中断したらいけないんだね。
でもなぜ途中で終わらせたらいけないのかな?
例えば、ATMの振り込みについて考えましょう。
いぬさんがネコさんに1万円を振り込む場合、次の2工程があります。
- いぬさんの口座残高が1万円減らす
- ねこさんの口座残高を1万円増やす
①だけ実行して、②をやっていない状態で終えてしまう場合、半分の処理が終わったというわけではなくNG行為ですね。
途中で止まったら、送金などで口座残高を変更されてしまう可能性があるね。
だから、All or Nothingなんだね。
一般的には、コミットメント制御と呼ばれる仕組みを使って、原子性を担保します。
コミットメント制御についての記事はこちら。
Consistency(一貫性)
一貫性とは、データベースの内容を矛盾させないという特性です。
トランザクションの前後でデータの整合性が保たれ、矛盾が生じないことです。
一貫性を担保するために、同時実行制御という仕組みを用います。
Isolation(隔離性)
隔離性とは、他のトランザクションの影響を受けないという特性です。
なぜなら、データの更新で不整合が発生することを防ぐためです。
しかし、複数のトランザクションを並列に実行させないということは、処理を一つずつ実行するということ。
つまり、処理の効率が落ちてしまうのです。
データの不整合を防ぐために、なるべく並列に実行したいけど、
処理の効率も上げたいよ。
そのため、トランザクションの並列度合いと不整合発生の度合いのバランスを見極める必要があります。
並列度合いと不整合発生の度合いはトレードオフだから、業務の内容によって妥協点を探すんだ。
隔離性にはレベルがあります。
詳しくはこちらの記事をご参照ください。
Durability(耐久性)
耐久性は、正常終了したトランザクションの実行結果は失われないという特性です。
一度正常終了したら、その後にシステム障害が発生しても、実行結果が失われないように制御します。
耐久性は、障害回復制御で担保します。
障害回復制御の詳細はこちらの記事で解説。
トランザクションをSQLで書いてみよう
①トランザクション開始の宣言
トランザクションを開始するためには、次のSQLを実行します。
BEGEN TRANSACTION [トランザクション名]
TRANSACTIONは略して「TRAN」でも実行できます。
トランザクション名は32文字まで有効です。
②実施したい処理をSQLで実行する
トランザクションとして実行したい処理を書きます。
更新ならUPDATE、削除ならDELETEです。
③-1 トランザクションを終了する
トランザクションをコミットして修了するときは、COMMIT句を発行しましょう。
COMMIT [トランザクション名]
③-2 トランザクションを中断する
障害などでトランザクション処理をなかったことにしたい場合は、ロールバックを行います。
ロールバックをすることで、トランザクション前の状態に戻すことができます。
ROLLBACK [トランザクション名]
まとめ
- トランザクションとは、複数の処理をまとめた一連の流れのこと。
- トランザクションは、ACID特性がある。
ACID特性 | 内容 | 担保の方法 |
---|---|---|
原子性 | すべて実行するか、全く実行されないか | コミットメント制御 |
一貫性 | データの矛盾が生じない | 同時実行制御 |
隔離性 | 他のトランザクションの影響を受けない | 隔離性レベル |
耐久性 | 正常終了したトランザクションの実行結果は失われない | 障害回復制御 |
- SQLでトランザクションを実行するときは、開始の宣言、コミット、ロールバックの3種を使う。