javascript
java 配置嵌套事务_Spring 事务嵌套的配置
問題
在使用Spring管理Service層事務時,會遇到service方法事務嵌套的問題。
默認情況下,service方法有自己獨立的事務,如果一個復雜的service方法中,調用了多個事務操作,中間拋出異常時,往往不會發生事務回滾。這時候我們需要一種自動的方式來完成回滾。
Spring的事務傳遞機制
PROPAGATION_REQUIRED 如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。
PROPAGATION_SUPPORTS 支持當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY 使用當前的事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW 新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER 以非事務方式執行,如果當前存在事務,則拋出異常。
PROPAGATION_NESTED 如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與 PROPAGATION_REQUIRED 類似的操作。
事務傳遞機制,有PROPAGATION_NESTED這樣一個機制。
當我們在service方法中配置了這個方式
@Transactional(propagation=Propagation.NESTED)
public void save(Entity entity) {
//保存實體對象操作
}
運行之后系統異常, 提示當前配置不支持NESTED事務.
解決辦法
查了一些代碼后發現在HibernateTransactionManager中發現這樣一段內容,其中有isNestedTransactionAllowed的判定。
protected Object doGetTransaction() {
HibernateTransactionObject txObject = new HibernateTransactionObject();
txObject.setSavepointAllowed(isNestedTransactionAllowed());
//...
}
所以在Hibernate配置中添加nestedTransactionAllowed的配置
然后所有的事務都自動使用嵌套事務了,也不需要修改任何service的代碼和配置,可以在service方法上去掉(propagation=Propagation.NESTED)這段。
注意
PS : 當出現Unchecked Exception時,就會回滾整個Service事務.
注意
(1)必須是Unchecked Exception才回滾
(2) 即使調用了Hibernate session的flush方法,也會被回滾
總結
以上是生活随笔為你收集整理的java 配置嵌套事务_Spring 事务嵌套的配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现代软件工程 团队作业 - 软件分析和用
- 下一篇: java grpc 客户端处理 go 服