Springの@Transactional(readOnly=true)で読み取り専用のトランザクションにする

Springの@Transactional(readOnly=true)で読み取り専用のトランザクションにする

org.springframework.transaction.annotation.Transactionalアノテーションでトランザクション管理ができますが、readOnly=trueとすると登録更新が出来ないトランザクションになります。省略時のデフォルトはreadOnly=falseです。

userテーブルにデータが2件入っています。

Springの@Transactional(readOnly=true)で読み取り専用のトランザクションにする

readOnly=trueにして、サービスクラスでパスワードを変更してみます。

package jp.co.confrage.service;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import jp.co.confrage.entity.UserEntity;
import jp.co.confrage.repository.UserRepository;
import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class UserService {
  private final UserRepository repository;
  /**
   * 読み取り専用メソッド
   */
  @Transactional(readOnly = true)
  public void update() {
    UserEntity entity = repository.findById(1L).orElse(null);
    entity.setPassword("123");

    repository.save(entity); // 更新されず、例外も発生しない
  }
}

上記のupdateメソッドは更新をしていますが、saveメソッドで実際は更新されずに例外も発生しません。

readOnly=false、もしくは省略すれば正しく更新されます。

コメント

タイトルとURLをコピーしました