簡體   English   中英

春天@Transactional。 真正如何運作?

[英]Spring @Transactional. How does it really work?

我們在項目中使用Spring和Hibernate。 我們正在使用Spring事務注釋,我們知道它的作用,但是對於回滾我們仍然有一些疑問。

假設我們有以下代碼。

@Transactional
@Service
public class PersonServiceImpl implements PersonService {

    @Autowired
    private PersonDao personDao;

    @Autowired
    private AnotherService anotherService;

    @Override
    public void doSomething() throws Exception {
        Person person = new Person();
        person.setName("John");
        personDao.insert(person);
        person.setName("Megan");

        //What happens if the following call fails and throws and exception.
        personDao.update(person);

        // What happens if this other service's call fails?
        anotherService.doSomethingElse();
    }

}

如果更新或其他服務的調用失敗,則插入會發生什么? 是否會有回滾,並且插入將永遠不會執行? 還是插入仍會保留在數據庫中? 我是否需要在每個方法中聲明以下命令以執行回滾。

@Transactional(rollbackFor= Exception.class)

在這種情況下,如果我的服務調用引發異常怎么辦? 它仍然有效嗎? 謝謝您的幫助。 我真的很想了解在服務調用中執行回滾的方式。

默認情況下,如果選中了異常(擴展了Exception),則不會發生回滾-事務將被提交。 否則(如果更改了默認值,或者我們正在談論未經檢查的異常),則事務將回滾,並且INSERT / UPDATE語句不會保留任何內容。 順便說一句,這在JavaDocs中對rollbackFor屬性進行了描述;)

如果異常最終是從您的Transactional方法拋出的,則該異常的起源無關緊要。

如果不確定行為,可以隨時調試Spring的HibernateTransactionManager及其超類。

暫無
暫無

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

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