日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

java 配置嵌套事务_Spring 事务嵌套的配置

發布時間:2024/7/23 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 事务嵌套的配置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。