2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

トランザクションてなんぞや

Last updated at Posted at 2020-04-13

トランザクションという言葉。何度か聞いたことがあり、その度に調べては忘れることを何度か繰り返したので、初心者ながら一度簡単に調べてまとめてみる。

トランザクションとは

複数の SQL によるデータベースに対する処理を1つの処理としてまとめてデータベースに反映させること。

必要な場面

  複数の処理を連続して行う際、すべての処理が成功したときにのみデータベースへの変更を有効にしなければならない場合。
   →  一部の処理が正しく実行されなかった場合には、すべての処理をキャンセルして取り消す(ロールバックする)ことが可能。

よくある簡単な例 「銀行の入出金システム」

 例:【Aさんの口座から100万円をBさんの口座に移動させる処理】
  ●必要な処理は以下の2つ
   1. Aさんの口座から100万円をマイナスする処理
   2. Bさんの口座へ100万円をプラスする処理
 
  もし、トランザクションを利用せずに上記処理を行い、2つ目の処理に失敗した場合、
  Aさんの口座からは100万円がなくなり、Bさんの口座はそのままで、お金がなくなってしまう。
  つまり、データの不整合が起こってしまう。

  こういった場合に、トランザクションを利用すれば、1,2の処理を1つのトランザクションとしてまとめ、
  すべての処理が成功した場合にのみ、口座の変更内容が確定(コミット)される。
  処理が一部でも失敗した場合には、すべての処理が取り消される(ロールバック)されるため、
  口座の変更は発生せず、データの整合性は維持される。
  

Laravel での使い方

transaction() メソッドを使用する方法

    DB::transaction(function () {
          $a -= 100;
          $b += 100;
      });

  クロージャの中で例外が投げられると、自動的にロールバック(処理を取り消し)し、クロージャが正しく実行されると、自動的にコミット(処理を反映)される。

beginTransaction() メソッドを使用する方法(手動トランザクション)

      DB::beginTransaction();
      try {
          // 一連の処理
          $a -= 100;
          $b += 100;
      DB::commit(); // トランザクションをコミット
      } catch (Exception $exception) {
          DB::rollBack(); // トランザクションをロールバック
          throw $exception;
      }
2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?