俺是個粗人,那麼俺就用最白話的語言來說說俺心目中的事務傳播行為。
事務這個我在此部落格的其他帖子中也有專門說過:通俗的理解就是,乙個需要做多件事的乙個任務。事務是具有原子性,同乙個事務中,所有的事情要麼都沒做,要麼都做完了。這樣說就應該理解了事務,那麼事務的傳播行為就可以很好理解了。
用具體的業務場景,我們來講講。比如哈,
老王我準備去逛逛某寶,然後挑了1個足球,2個籃球,3個羽毛球拍(是的,我開文體店的。),都在購物車靜候我統一下單付款了。
我的媽,我試了一下,我把這3樣東西全部勾上,然後一鍵下單付款的時候,它提示我餘額不足,然後給全部打回來了。。
誒,我就開始思考了,老馬不會做生意啊,我錢不夠,但是又不是沒有錢,我有5塊,按道理來說,你內部其實是一樣商品一樣商品的付款的。我先買了乙個足球:2塊,然後扣完,我還剩3元;然後我再買2個籃球:6塊,不夠錢,然後再提示餘額不足就是了嘛。就因為我不夠買全部的,你就一樣都不賣給我了?這還(讓天底下沒有難做的生意?)
那麼站在實際開發的角度,我上述的可以分析一下了
對於商品下單購買這種需求,通常來說,我們都需要對每個環節加上事務控制的,保證交易的正常執行。
對於我一鍵下單,那麼就是向後台提交了乙個請求,然後這個請求方法是加上事務控制的,然後在這個事務內部分為
足球扣款、籃球扣款、籃球扣款、羽毛球扣款、羽毛球扣款、羽毛球扣款。那麼這5個步驟都會再細分為5個方法執行流程。那麼5個方法,每個方法也都會有對應的事務控制。控制著,我支付寶賬戶扣款、賣家支付寶賬戶增款等。然後就是考慮事務的控制了。
那麼這個時候,它在籃球扣款任務階段,發現第二個籃球扣款的時候,餘額不足了。那麼就需要事務回滾了,第乙個籃球扣的款全部撤銷。這個時候有兩種情況了
(1)如果足球扣款、籃球扣款、羽毛球扣款是事務a、那麼如果籃球的每乙個扣款也加入了事務a,那麼如果第二個籃球扣款失敗了,發生異常情況,那麼事務a就會回滾。從而導致所有的商品都無法下單成功了。
(2)如果足球扣款、籃球扣款、羽毛球扣款是事務a,那麼如果籃球的每乙個扣款事情都自己建立了乙個事務b、c、d....。那麼這個時候,事務b成功了,事務c失敗了,並不會影響事務b的成功執行。這個時候就是老馬發現你就5塊錢,就按順序來,賣給你5塊錢最大買到的東西。
那麼肯定還有其他的處理方案。老馬做生意肯定有很多種套路的。
當事務方法被另乙個事務方法呼叫時,必須指定事務應該如何傳播。比如:方法繼續在現有事務中執行,也可能開啟乙個新事務,並在自己的事務中執行。
事務的傳播新聞可以由傳播屬性制定。spring中定義了7中傳播行為。
注意:事務傳播屬性可以在@transactional註解的propagation屬性中定義。預設的事務傳播屬性為require
d
事務傳播行為
事務傳播行為型別 說明propagation required 如果當前沒有事務,就新建乙個事務,如果已經存在乙個事務中,加入到這個事務中。這是最常見的選擇。propagation supports 支援當前事務,如果當前沒有事務,就以非事務方式執行。propagation mandatory 使用...
spring 事務傳播行為
事務傳播行為種類 spring在transactiondefinition介面中規定了7種型別的事務傳播行為,它們規定了事務方法和事務方法發生巢狀呼叫時事務如何進行傳播 事務傳播行為型別 事務傳播行為型別 說明propagation required 如果當前沒有事務,就新建乙個事務,如果已經存在乙...
事務的傳播行為
所謂事務的傳播行為是指,如果在開始當前事務之前,乙個事務上下文已經存在,這時有七個屬性可以指定該事務的執行行為。1.propagation required 如果當前存在事務,則加入該事務 如果當前沒有事務,則建立乙個新的事務。這是預設值 2.propagation supports 如果當前存在事...