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) {
// ...
}