みなさん、こんにちは。若葉マークブログという事で、SQL Server 初心者の方々へ向けて、第 1 回はトランザクションの基本についてお話したいと思います。
SQL Server を扱っていると、「トランザクション」という言葉を日常的によく耳にすると思います。
トランザクションとは、関連する複数の処理を 1 つの処理単位としてまとめたもので、この処理単位でデータベースへの反映がおこなわれます。
A さんが銀行の ATM を使って、自分の 2 つの口座 の「口座 1 」 から「口座 2 」に 50,000 円 を振り込もうとしています。
口座 1 には現在は 300,000 円 の預金があり、口座 2 には 100,000 円の預金があります。
振り込みをおこなうと、口座 1 は 50,000 円引かれるので 250,000 円、口座 2 は 50,000 円足されるので 150,000 円になるはずです。
しかしここでハプニングが発生しました。振り込みの操作をしている最中に突然 ATM の機械が故障して停止してしまったのです。
故障した ATM の復旧には時間がかかるため、他の ATM を利用してほしいと銀行の人から言われた A さんは、隣の ATM から振り込みがどうなったかを確認してみました。
すると、口座 1 は 300,000 円 、口座 2 は 100,000 円という振り込み前の預金額に戻っていました。
A さんは正常に動作している ATM から再度振り込みをおこない、今度は無事に完了することができました。
ここに、「トランザクション」の活躍があります。
もしトランザクションが存在しなかったら、「口座 1 からは 50,000 円引かれていたが、口座 2 には 50,000 円が足されていなかった」という大変な事態が発生する可能性があります。
上記の銀行振り込みの例では、「口座 1 から 50,000 円引く、その後で口座 2 に 50,000 円足す」という処理が、一つの処理単位(トランザクション)としてまとめられています。
そのため、操作中に ATM が故障して「口座 1 から 50,000 円引く」という処理が完了した時点で ATM の機械が故障して停止してしまったとしても、「その後で口座 2 に 50,000 円足す」という処理が正常に完了していないため、トランザクションは ロールバック (rollback : 巻き戻し)されて振り込み処理の実行前の状態に戻ったのです。
「口座 1 から 50,000 円引く、その後で口座 2 に 50,000 円足す」という一連の処理が正常に完了した場合にのみ、振り込みの処理はコミット (commit : 確定) されてデータベースに反映されます。
■ロールバックとコミット
上記の銀行振り込みの例では、ATM の機械が故障して停止してしまった時点で「その後で口座 2 に 50,000 円足す」という処理が正常に完了していなかったため、「口座 1 から 50,000 円引く」という正常に実行された処理も含めてトランザクション全体が ロールバックされました。
「ロールバック」とは「巻き戻し」の意味で、データベースでデータの更新が正常に完了しなかった際に更新前の状態にまで戻ることをいいます。
ロールバックはトランザクション単位で行われるため、「口座 1 から 50,000 円引く、その後で口座 2 に 50,000 円足す」というトランザクションがロールバックされて、「口座 1 からは 50,000 円引かれていたが、口座 2 には 50,000 円が足されていなかった」という大変な事態を回避できたのです。
また、上記の銀行振り込みの例の最後で、A さんは ATM から再度振り込みをおこない、無事に完了することができましたが、この時には「口座 1 から 50,000 円引く、その後で口座 2 に 50,000 円足す」という一連の処理が正常に完了したため、振り込みの処理はコミットされてデータベースに反映されています。
「コミット」とは「確定」の意味で、トランザクションの一連の処理が確定されてデータベースに反映されます。
コミット後は、トランザクションをロールバックすることはできません。
|