Будет ли @Transactional и @Async аннотировать один и тот же метод службы, что транзакция станет недействительной?
Официальный аккаунт:Техническая команда когнитивных технологийАли Ява интервью:Будет ли @Transactional и @Async аннотировать один и тот же метод службы, что транзакция станет недействительной?
Теперь представим @Transactional и @Async Могут ли разные методы аннотации использоваться вместе (называть друг друга)?
@Transactional и @Async Аннотированные методы можно вызывать друг у друга, но есть несколько ключевых моментов, на которые следует обратить внимание, чтобы они работали должным образом.
@Transactional — это аннотация в среде Spring, используемая для объявления того, что метод или класс требуют поддержки транзакций. При вызове этого метода Spring создаст новую транзакцию или присоединится к существующей транзакции для выполнения этого метода, если он выполняется в контексте транзакции, но основное поведение определяется поведением распространения транзакции.
@Async — это аннотация для асинхронного выполнения в Spring. Когда вы помечаете метод как @Async, Spring выполнит его асинхронно в отдельном потоке.
Когда вы объединяете @Transactional и @Async , вам необходимо убедиться, что границы транзакций управляются правильно. потому что @Async Метод будет выполняться в отдельном потоке, что может вызвать проблемы, если вы неправильно настроите поведение распространения транзакций.
Вызов метода @Transactional в методе @Async
Если мы Вызов метода @Transactional в методе @Async,Spring будет правильно управлять делами и распространять их контекст.,от для обеспечения согласованности данных。
@Async
public void transferAsync(Long depositorId, Long favoredId, BigDecimal amount) {
transfer(depositorId, favoredId, amount);
// other async operations, isolated from transfer
}
@Transactional
public void transfer(Long depositorId, Long favoredId, BigDecimal amount) {
Account depositorAccount = accountRepository.findById(depositorId)
.orElseThrow(IllegalArgumentException::new);
Account favoredAccount = accountRepository.findById(favoredId)
.orElseThrow(IllegalArgumentException::new);
depositorAccount.setBalance(depositorAccount.getBalance().subtract(amount));
favoredAccount.setBalance(favoredAccount.getBalance().add(amount));
accountRepository.save(depositorAccount);
accountRepository.save(favoredAccount);
}
от @Async
Вызывается в методе @Transactional
Метод повышает производительность, поскольку позволяет выполнять определенные внутренние операции параллельно с вызывающим потоком, не вызывая несогласованности данных.
в @Transactional Вызывается в методе @Async метод
Spring В настоящее время используется ThreadLocal Для управления транзакциями текущего потока. Следовательно, он не разделяет контекст потока между разными потоками.
поэтому,еслииспользовать @Transactional Метод аннотации вызывает ause @Async Аннотированный метод, Весна Тот же контекст потока транзакций не распространяется.
Это означает, что дела, выполняемые в существующем асинхронном методе, не будут использовать тот же контекст, что и дела, которые вызвали нить. У каждого нит свой ThreadLocal Переменная копия, что означает, что каждая нить имеет свой собственный контекст дела. Когда отделметод вызывает асинхронный метод, этому необходимо уделять особое внимание, чтобы обеспечить согласованность и целостность данных. Если вам необходимо поддерживать контекст дела, вам может потребоваться принять дополнительные меры, такие как определенное поведение распространения или перехват и обработка исключений, которые могут возникнуть в асинхронном методе.
поэтому,Чтобы избежать этой проблемы согласованности данных,Мы должны избегать @Transactional Вызывается в методе @Async метод, потому что нить распространения контекста не происходит。
Короче говоря, @Transactional и @Async Аннотированные методы можно вызывать друг в друге, но вам необходимо убедиться, что вы понимаете и правильно справляетесь со связанными сложностями и потенциальными проблемами существования.