Spring 在乙個事務中開啟另乙個的事務

2021-10-02 00:23:15 字數 1823 閱讀 9391

什麼是事務?可以參考我的這篇部落格!

spring boot 怎麼使用spring的事務控制機制?可以參考我的這篇部落格!

通常的情況下,一般的事務直接在service類上新增@transactional註解,spring就會幫我們替所有方法自動生成事務。但是在某些情況下,很少出現的。我們希望在乙個方法上,出現兩個事務,而且2給事務之間互不影響。

如:乙個使用者的修改操作以及系統的刪除操作

@service

public class testservice

@transactional(propagation = propagation.requires_new)

public void systemdelete(

)}

propagation.requires_new:表示如果當前存在事務,則掛起當前事務並且開啟乙個新事物繼續執行,新事物執行完畢之後,然後在緩刑之前掛起的事務,如果當前不存在事務的話,則開啟乙個新事物。

上面的例子,在使用systemdelete()的時候,我顯性的丟擲乙個執行期異常。按照最初的想法,systemdelete()會進行rollback,而使用者修改操作不會。但是觀察資料庫會發現,這2個spring事務都進行了回滾。

那麼如果我們抓住systemdelete()丟擲的異常

@service

public class testservice catch (exception e)

} @transactional(propagation = propagation.requires_new)

public void systemdelete(

)}

這次會發現2個操作都成功了。說明這2個操作其實都在同乙個事務之中。

有2種方法可以解決這種場景

@service

public class servicea

}@service

public class serviceb

}

spring 也考慮過這個問題提供了解決方案

spring配置使用

spring xml配置

"true"/>

"true"

>

<

!-- spring xml配置上面2個節點的乙個就可以了,效果是一樣的。這個配置是讓spring暴露出**物件 -->

2.在**的呼叫中要求使用**物件去呼叫即可

((testservice) aopcontext.currentproxy(

)).systemdelete(

);

spring boot 配置使用

當然現在主流的 spring boot 也是支援使用的 aop **的

1.引入spring aop依賴

org.springframework.boot

spring-boot-starter-aop

2.新增註解暴露**物件

@enableaspectjautoproxy(exposeproxy = true)

public static void main(string[

] args)

}3.在**的呼叫中要求使用**物件去呼叫即可

((testservice) aopcontext.currentproxy(

)).systemdelete(

);

Spring在乙個事物中開啟另乙個事物並提交

自己平時的一點筆記 在對資料庫資料進行修改操作時,當 現異常時,那麼事物就會進行回滾操作,資料庫內的資料將不會被修改 但總是會有一些需要就是即使 中途報錯了,也要將資料庫中的資料進行修改,這時,就需要重新開啟乙個事物去提交 方法一 運用註解 transactional propagation pro...

如何開啟乙個事務

mysql的事務處理主要有兩種方法。1 用begin,rollback,commit來實現 begin 開始乙個事務 rollback 事務回滾 commit 事務確認 2 直接用set來改變mysql的自動提交模式 mysql預設是自動提交的,也就是你提交乙個query,它就直接執行!我們可以通過...

在service中開啟乙個dialog

純粹是個人學習總結,如有不對的地方請吐槽。在dialog show方法之前新增如下 表示該dialog是乙個系統的dialog dialog.getwindow settype windowmanager.layoutparams.type system alert 測試 builder build...