Spring-boot: если метод в Сервисе является @Transactional, и этот метод вызывает другие методы, являются ли они также транзакционными? - PullRequest
0 голосов
/ 07 октября 2019

Допустим, у меня есть этот метод в моей службе @Serviceal. Если я вызову другой метод в этом методе, будут ли действия базы данных в другом методе также Транзакционными как часть той же транзакции?

@Transactional
public ResponseEntity<List<String>> saveListOfValidationSteps(List<ValidationStep> steps, String controlId, String aNumber){

 deleteOldSteps();
 //calls to repo to add new columns

}

private void deleteOldSteps(){
/calls to repo to delete old columns
}

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Да, код в deleteOldSteps () присоединится к текущей транзакции (начатой ​​saveListOfValidationSteps). Если вы используете LocalContainerEntityManagerFactory, то Spring самостоятельно будет управлять транзакциями и присоединит экземпляр entityManager к ThreadLocal, поэтому, когда выполняется код внутри deleteOldSteps (), Spring сначала проверяет, существует ли EntityManager в ThreadLocal и использовать повторно, если он уже существует (для присоединения к существующему контексту постоянства).

Итак, когда saveListOfValidationSteps () вызывается извне, Spring запускает новую транзакцию, а когда deleteOldSteps вызывается из локальной системы, онаприсоединится к существующей транзакции (из-за данных ThrealLocal).

ПРИМЕЧАНИЕ: Но если deleteOldSteps не помечено @Transactional, и если deleteOldSteps не запуститсяновая транзакция, потому что локальные вызовы не учитываются пружинными аспектами.

0 голосов
/ 07 октября 2019

Да.

@Transactional под этим колпаком добавлен специальный перехватчик «вокруг», который инициирует транзакцию перед входом в метод и фиксирует / выполняет откат после завершения метода.

Покаметод вызывает другие методы в том же потоке, все они будут частью транзакции.

...