JPA Locking Transaction на уровне сервиса - PullRequest
0 голосов
/ 06 июня 2019

В моем приложении Spring-boot я запускаю массовое обновление для двух моих таблиц каждый час, и мне нужно предотвратить любые чтения / записи / удаления на двух таблицах во время обновления (процесс длянесколько секунд).Я попробовал нижеприведенное, но, похоже, не выдает исключение блокировки, как я ожидаю, когда я пытаюсь ПРОЧИТАТЬ во время процесса обновления.Есть ли способ заблокировать базу данных и заставить ее генерировать исключение во время выполнения следующей транзакции?

@Service
public class ParentService {

    @Autowired
    private ParentRepository parentRepository;

    @Autowired
    private ChildRepository childRepository;

    @Transactional
    @Lock(LockModeType.PESSIMISTIC_WRITE)
    public void refresh(List<ParentEntity> parents) {

        childRepository.deleteAllInBatch();
        childRepository.resetAutoIncrement();
        parentRepository.deleteAllInBatch();
        parentRepository.resetAutoIncrement();
        parentRepository.save(parents);
    }
}

@Repository
@Transactional
public interface ParentRepository extends JpaRepository<ParentEntity, Integer> {

    @Modifying
    @Query(
            value = "alter table parent auto_increment = 1",
            nativeQuery = true
    )
    void resetAutoIncrement();
}

@Repository
@Transactional
public interface ChildRepository extends JpaRepository<ChildEntity, Integer> {

    @Modifying
    @Query(
            value = "alter table child auto_increment = 1",
            nativeQuery = true
    )
    void resetAutoIncrement();
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...