😽

Transaction(トランザクション)

2022/10/23に公開

初めまして、Junior Back-end Developer、SIMOKITAZAWAです。
色々と足りないところがあるかと思いますがよろしくお願い致します。

私がZENNを始めた理由は、

  1. 私が勉強したことをまとめたい
  2. 勉強の内容を共有して一緒に成長したい
  3. 私が間違って理解している部分について先輩たちに教えてもらいたい

このような理由で始めることになりました。
たくさんの教えをお願いします。

私たちはApplicationを作る時にTransactionという単語をよく聞いたり、見たり、使ったりします。Transactionというものはなんでしょうか
Transactionについて勉強を始めます。

Transactionとは?

Transactionは単語の意味、そのまま取引という意味です。

AはBに1000円でMacBookを買います。A→B 1000円
BはAにMacBookを1000円で売ります。B→A MacBook
AはMacBookをもらってBは1000円をもらったら取引が成功になります。

しかしAはBに1000円を振り込みましたが、BはAにMacBookを送らなかったです。逆にBはAにMacBookを送りましたが、AはBに1000円振込しませんでした。この場合は取引したと言えません。どちらかは損になります。
この場合がApplicationで起きたとしたら、そのApplicationは誰も使わないApplicationになりますね。

Transactionとは、取引をする際にAもMacbookを受け取ることになれば、取引が成功したため、Databaseに正常な反映でcommitをすることになり、正常な取引でなければRollbackをして再び元の状態を復旧することになります。

ServerはDatabaseにDataを送って、Databaseから結果をもらいます。また、その結果でプラグラムのロジックを行います。
Aが1000円振り込みをしようとしたが、急に“あ”銀行のServerがErrorになったと仮定しましょう。

そうしたら、TransactionはRollbackになって1000円はAに戻りますね。Bは1000をもらっていない状態です。
そこで、DatabaseがCommitの状態だったらBはAから1000円もらったことになってMacBookを送ります。TransactionはRollbackしなければなりません。
Transaction内で実行した作業は、まるで一つの作業であるかのようにすべて成功または失敗しなければならなりません。

  1. Aが1000円を振り込むのが作業1、
  2. BがMacbookを送るのが作業2
    皆成功するか失敗しなければならなりません。

Transactionの順番

  1. AはWebを使って1000円振り込みします。
  2. そのDataはServerのServiceロジックからDatabaseに伝達します。
  3. 伝達する時にあらかじめ作られたConnectionをConnection Poolから取ります。
  4. とったConnectionにDatabaseのID,Passwordを一緒に送ります。
  5. DatabaseはIDとPasswordを確認してSessionを作ります。
  6. 作られたSessionはTransactionを始まります。
  7. CommitかRollbackになるか

TransactionがCommitまでならないとBの講座には1000円が見えないです。
commitを行うまではDataが一時的に保存されます。したがって、Transactionを開始したSession(今はA)にのみ表示され、他(B)のSessionには表示されないです。

Transactionは手動commitと自動commitがありますが、自動commitをするとすぐにDataが反映されるため障害が発生しやすいです。手動commitはcommitをしてこそDataが反映されるため、SQL文が間違っている時にDataをRollbackして問題が発生することを防止することができます。
そのため、手動commitをする時にTransactionが始まると言えます。

Discussion