[英]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.