Skip to content

トランザクション制御

業務処理内でトランザクション制御を宣言し、例外が発生した際にデータベースをロールバックできるようにします。

cf. https://spring.pleiades.io/spring-framework/reference/data-access/transaction/declarative/annotations.html

実装

メソッド部で@Transactionalを宣言しています。下記コードの場合、不正な値nobを登録した場合でもロールバックが発生し、データの登録が取り消されます。

package nob.example.easyapp.service.impl;

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

import lombok.NonNull;
import nob.example.easyapp.domain.entity.Users;
import nob.example.easyapp.repository.UsersRepository;
import nob.example.easyapp.service.UserService;
import nob.example.easyapp.service.model.RegistUserInModel;
import nob.example.easyapp.service.model.RegistUserOutModel;

/**
 * UserServiceの実装クラスです。
 *
 * @author nob
 */
@Service
public class UserServiceImpl implements UserService {

    @NonNull
    private UsersRepository usersRepository;

    public UserServiceImpl(UsersRepository usersRepository) {
        this.usersRepository = usersRepository;
    }

    @Override
    @Transactional(rollbackFor = Exception.class) // トランザクション制御を宣言
    public RegistUserOutModel regist(RegistUserInModel inModel) throws Exception {

        usersRepository.save(new Users(inModel.getName(), inModel.getPassword(), inModel.getAge()));

        if (inModel.getName().equals("nob")) {
            throw new Exception("Invalid name");
        }

        return new RegistUserOutModel(true);
    }
}