[英]How to rollback with 2 transaction in same method on Spring Boot
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private RoleRepository roleRepository;
@Transactional
public void save(String name) {
method1(name);
method2(name);
}
public void method1(String name){
userRepository.save(name)
}
public void method2(String name) {
roleRepository.save(name);// Error
}
}
public interface UserService {
void save(String name) throws Exception;
}
@PostMapping("/save")
public void save() throws Exception {
userService.save("SomeThing");
}
我在 save 方法中有 2 個方法。 如您所見,method2 有錯誤。
我運行程序,第一種方法打印到數據庫。 但是,如果第二種方法不正確,我希望回滾過程失敗,並且第一種方法不要寫入數據庫。 我該怎么做?
我嘗試在方法 1 和方法 2 上使用@Transaction
注釋,但錯誤繼續。 我試過Propagation.REQUIRES_NEW
和Propagation.REQUIRED
, TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
從未改變。
這是完全合乎邏輯的,你正在嘗試做。 當您的流程的一部分失敗時回滾是正常的。
我將提供更多背景信息以確保您擁有一切:
@Transactional
僅在拋出RuntimeException
時回滾。 你可以自定義這個。 檢查文檔,很容易找到。 小心,確保您使用org.springframework.transaction.annotation.Transactional
。 你有更多的選擇。@Transactional
是Required
的,這意味着它要么加入現有的交易,或者創建一個新的。 Requires_New
總是創建一個新的。 在你的情況下, Propagation.REQUIRED
是好的。@Transactional
並進行內部調用將不會有任何效果。 當您從類的外部進入您的方法時,事務就開始了。 一旦你進入你的班級,其他注解就不會影響運行時。需要考慮的三件事/問題:
RoleRepository.save(...)
出現什么樣的錯誤?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.