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

歡迎訪問 生活随笔!

生活随笔

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

javascript

Spring嵌套事务控制

發布時間:2025/3/15 javascript 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring嵌套事务控制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

A類 ? callBack_test()

B類 ? testadd()

C類 ? select(),得查詢到B類testadd方法中新增的數據。以及初始化一些屬性


場景:A類 嵌套 B類? B類嵌套C類;都是由spring控制事務。

要求:B類testadd方法中不受spring事務控制,單獨新開個事務運行,可以使C類查詢的到。

問題:A類是系統底層方法,必須受事務控制。且C類必須查詢到剛剛add的數據。

分析:初步分析為:Spring事務傳播性導致的,從A類開啟的事務,就有完結。為了避免這樣的情況。最好將相關類。不要讓spring控制事務。

解決:B類中testadd()方法顯示開啟事務。方法例如以下:

? //testadd方法中數據不受事務控制(要求:是否下發成功。不影響興許代碼運行;因此要開啟一個新事務)
? //開啟新事務,防止跟其它事務混淆
? DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) SpringContextFactory
? .getBean("transactionManager");
? DefaultTransactionDefinition def = new DefaultTransactionDefinition();?
? def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); //事物隔離級別,開啟新事務,與A類和B類不使用同一個事務。
? TransactionStatus status = transactionManager.getTransaction(def); //獲得事務狀態

try{

???? **************代碼邏輯****************

??? transactionManager.commit(status);
? }catch (Exception e) {
?? // TODO: handle exception
?? transactionManager.rollback(status);
? }

?

補充:

將B類中testadd方法配置成不讓spring事務控制,testadd方法顯示開啟事務。手動提交。


嘗試:

將B類的testadd方法增加spring事務控制中,且配置事務級別為PROPAGATION_REQUIRES_NEW

不起作用,原因是直接把當前事務給掛起了

  • PROPAGATION_REQUIRED:假設當前沒有事務,就新建一個事務,假設已經存在一個事務,就增加到這個事務中。

    這是最常見的選擇。

  • PROPAGATION_SUPPORTS:支持當前事務,假設當前沒有事務。就以非事務方式運行。
  • PROPAGATION_MANDATORY:使用當前的事務,假設當前沒有事務,就拋出異常。
  • PROPAGATION_REQUIRES_NEW:新建事務,假設當前存在事務,把當前事務掛起。

  • PROPAGATION_NOT_SUPPORTED:以非事務方式運行操作,假設當前存在事務。就把當前事務掛起。

  • PROPAGATION_NEVER:以非事務方式運行。假設當前存在事務。則拋出異常。

  • PROPAGATION_NESTED:假設當前存在事務,則在嵌套事務內運行。假設當前沒有事務,則運行與PROPAGATION_REQUIRED類似的操作

2. 備注:

?? 疑問:怎樣手動提交spring管理的事務?注:spring事務級別是PROPAGATION_REQUIRED

? 答案:首先在類開始部分。開啟一個事務,事務的隔離級別假設是PROPAGATION_REQUIRED。手動提交事務不起作用。

???????????? 事務的隔離級別須要配置成.PROPAGATION_REQUIRES_NEW。手動提交事務才干起作用。

//開啟新事務,防止跟其它事務混淆
? DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) SpringContextFactory
? .getBean("transactionManager");
? DefaultTransactionDefinition def = new DefaultTransactionDefinition();?
? def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); //事物隔離級別,開啟新事務,與A類和B類不使用同一個事務。


? TransactionStatus status = transactionManager.getTransaction(def); //獲得事務狀態


參考引用:http://blog.csdn.net/ziyunlong1984/article/details/7725585

http://blog.chinaunix.net/uid-10289334-id-2964925.html

http://blog.csdn.net/hy6688_/article/details/44763869


轉載于:https://www.cnblogs.com/lxjshuju/p/6914417.html

總結

以上是生活随笔為你收集整理的Spring嵌套事务控制的全部內容,希望文章能夠幫你解決所遇到的問題。

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