0
0

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 1 year has passed since last update.

ぅゅ...ぷんぽぷんぽAdvent Calendar 2022

Day 23

【Spring Framework】@Transactionalを使って簡単にトランザクション処理を行う。

Last updated at Posted at 2023-04-07

Spring Frameworkにおけるアノテーションとは

Spring Frameworkではアノテーションを使用することで、フレームワークが提供している機能を簡単に利用することができる。

使用方法も簡単で、使用したいJava要素にアノテーション名を書き加えるだけ。

例)

@Controller
public class SampleController {
    //処理
}

この例では@controllerアノテーションを使用してます。
@controllerアノテーションを付与することでSpringはこのクラスをコントローラーであることを認識し、HTTPリクエストを受け付けるようになります。
ヒトが読む場合にも、アノテーション一つでコントローラーと識別できるので可読性が上がりますね。すごい

@transactionalアノテーション

今回使用する@transactionalアノテーション。
このアノテーションをメゾッドに付与することでコミット/ロールバック/セーブポイント等のトランザクションに関する一連の処理を行ってくれます。

使い方

上の例の通り、トランザクション処理を行いたいメゾッドに付与します。

例)

@Service
public class Sample implements SampleService {

    @Autowired
    private UserRepository userRepository;

    @Transactional
    public User createUser(User user) {
        // トランザクション処理
    }
}

これだけでcreateUserメゾッド開始時に自動的にトランザクション処理が機能する。正常に終了すればコミット、失敗すればロールバック処理が行われる。

注意点

ネストしているメゾッドは呼び出し先にもアノテーションをつける

トランザクション処理を開始したメゾッドが他のメゾッドを呼び出す場合、そのメゾッドにもアノテーションを付与する

@Service
public class A {
 
    @Transactional
    public void doA() {
        doB();
    }

     public void doB() {
       //DB処理
    }
}

途中で呼び出されているdoBには@transactionalアノテーションがついていないため、doBで書かれている処理はアノテーションの対象外になってしまう。
呼び出し先のメゾッドにも@transactionalをつけよう。

コントローラー処理に@transactionalアノテーションはつけないようにする

コントローラー層で@transactionalを付与してはいけない、service層で@transactionalアノテーションを付けるのが良い

ダメな例)

@Controller
public class Controller {

    @Autowired
    private Service service;

    @Transactional
    @PostMapping("/service")
    public ResponseEntity<> doService(@RequestBody service) {
       //処理
    }
}
エラーハンドリング

@transactionalはRuntimeExceptionをスローするメソッドの場合にロールバックを行います。Exceptionをスローする場合は、catchして処理するか、明示的にトランザクションをロールバックする必要がある

以下のように。@transactionalに(rollbackFor = Exception.class)をつけてあげると、RuntimeException,Exceptionとエラーの種類にかかわらずロールバックするようになる。

@Transactional(rollbackFor = Exception.class)
public void doSomething() throws IOException {
    // 例外が発生する可能性のある処理
}

終わりに

Spring Frameworkにはいろいろ便利なアノテーションがあるみたいなので、また時間あるときにほかの情報についてもまとめていきたい

アノテーションをたくさんまとめてくれているサイト

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?