簡體   English   中英

如何在 Spring Boot 上以相同的方法回滾 2 個事務

[英]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_NEWPropagation.REQUIRED , TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 從未改變。

這是完全合乎邏輯的,你正在嘗試做。 當您的流程的一部分失敗時回滾是正常的。

我將提供更多背景信息以確保您擁有一切:

  • 默認情況下,@ @Transactional僅在拋出RuntimeException時回滾。 你可以自定義這個。 檢查文檔,很容易找到。 小心,確保您使用org.springframework.transaction.annotation.Transactional 你有更多的選擇。
  • 理解傳播是關鍵。 缺省情況下,傳播@TransactionalRequired的,這意味着它要么加入現有的交易,或者創建一個新的。 Requires_New總是創建一個新的。 在你的情況下, Propagation.REQUIRED是好的。
  • 一旦你在一個事務方法中,在你的類中的其他方法上添加@Transactional並進行內部調用將不會有任何效果。 當您從類的外部進入您的方法時,事務就開始了。 一旦你進入你的班級,其他注解就不會影響運行時。

需要考慮的三件事/問題:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM