Skip to content

6.5. トランザクション管理

6.5.1. @Transactional使用規則

  • トランザクションはServiceレイヤーで宣言します。RepositoryやControllerでは宣言しません。
  • 照会専用メソッドにはreadOnly = trueを指定します。
java
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {

  private final UserRepository userRepository;

  @Override
  @Transactional
  public UserResponse createUser(CreateUserRequest request) {
    UsersRecord record = userRepository.insert(request.name(), request.email());
    return UserResponse.from(record);
  }

  @Override
  @Transactional(readOnly = true)
  public UserResponse findById(Long id) {
    UsersRecord record = userRepository.findById(id)
        .orElseThrow(() -> new UserNotFoundException(id));
    return UserResponse.from(record);
  }
}

6.5.2. トランザクション伝播規則

伝播レベル使用基準
REQUIRED(デフォルト)一般的なビジネスロジック
REQUIRES_NEW独立したトランザクションが必要な場合(ロギング、監査)
SUPPORTS使用しません
NOT_SUPPORTED使用しません

6.5.3. 注意事項

  • 同一クラス内部で@Transactionalメソッドを呼び出すとAOPが適用されません。
  • チェック例外(Checked Exception)発生時、デフォルトではロールバックされません。必要な場合はrollbackForを指定します。
java
@Transactional(rollbackFor = Exception.class)
public void processPayment(PaymentRequest request) {
  // ...
}

TIENIPIA QUALIFIED STANDARD