從控制台中可以看到hibernate列印出了一條insert語句,證明插入了一條資料,但是為什麼doa()方法和dob()方法都執行了卻只插入了一條資料呢?那插入的這條資料又是哪個方法裡面的呢?我們先到資料庫查詢一下:
可以明顯的看出,這條資料是dob()方法裡面插入的,而doa()中插入的資料被回滾了,這是因為我們在dob()方法中加入ropagation_requires_new傳播行為,dob()建立了屬於自己的事務,掛起了doa()中的事務,所以事務b提交了,而在doa()方法中加入的是ropagation_required傳播行為,事務a因為執行異常,不會再建立新的事務,因此插入的資料被回滾了。
注意:在上面的例項中,我們沒有把dob()方法放在usercontroller中,在doa()方法中直接呼叫dob()方法,而是放在了businessserviceimpl中,這是因為spring通過掃瞄所有含有註解的@
transactional的方法,使用aop形成事務增強advise。但是加入增強時是通過**物件呼叫方法的形式加入的,如果將dob()方法放在doa()方法直接呼叫時,在呼叫dob()方法的時候是通過當前物件來呼叫dob()方法的,而不是通過**來呼叫的dob()方法,這個時候dob()方法上加的事務註解就失效了不起作用。
如果我們將dob()方法做下修改,改為第一種傳播行為ropagation_required:
再來看測試結果:
可以明顯的看出,一條資料都沒有插入到資料庫中,這是為什麼呢?因為這兩個方法使用的都是第一種傳播行為propagation_required ,dob()方法被加入到doa()的事務中,doa()執行時丟擲了異常,因為dob()和doa()同屬於乙個事務,則執行操作被一起回滾了。其實在dob()中我們不加入註解,也等同propagation_required的效果,因為spring中事務傳播行為預設為propagation_required方式,它也是我們最常用的一種方式。
接下來我們再來看看第五種傳播行為propagation_not_supported,我們同樣修改dob()方法,將@transactional註解中的propagation改為propagation.not_supported,再看測試結果:
結果和上面第一種方式一樣,dob()方法成功插入了資料,而doa()方法中插入的資料被回滾了。這是因為傳播行為propagation_not_supported是dob()以非事務執行的,並且提交了。所以當doa()的事務被回滾時,dob()的操作沒有被回滾。
其他的傳播行為就不一一枚舉了,機制是差不多的。若大家還想更深入的了解事務傳播行為,推薦給大家一篇文章,寫的非常詳細:
Spring的7種事務傳播行為
事務傳播行為指的是乙個事務方法被另乙個事務方法呼叫時,這個事務方法應該如何進行。比如說,有乙個a方法,裡面呼叫了b方法,當執行到b方法時,是應該在當前事務裡執行,還是重新開啟乙個事務來執行,這是由b方法的事務傳播行為決定的 propagation required 表明當前方法一定要在事務中執行,如...
Spring事務的7種傳播行為
事務傳播行為指的就是當事務方法被另乙個事務方法呼叫時,這個事務方法應該如何進行。例如 methoda事務方法呼叫methodb事務方法時,methodb是繼續在呼叫者methoda的事務中執行呢,還是為自己開啟乙個新事務執行,這就是由methodb的事務傳播行為決定的。以下舉例時 方法a 中呼叫方法...
Spring7種事務傳播行為型別
事務傳播行為種類 spring在transactiondefinition介面中規定了7種型別的事務傳播行為,它們規定了事務方法和事務方法發生巢狀呼叫時事務如何進行傳播 事務傳播行為型別 事務傳播行為型別 說明propagation required 如果當前沒有事務,就新建乙個事務,如果已經存在乙...