spring 的事務問題,事務失效,事務傳播
阿新 • • 發佈:2019-02-09
1:同一個類,如下圖,我們調 service.methodA(),這時的話 methodA和 methodB都在 A定義的 事務內,只有在methodA 的方法裡throws RuntimeException 時 才會回滾,methodA和methodB都會回滾。(注意:如果methodB丟擲RuntimeException,但是methodA中把這種異常捕獲,並讓程式正常執行,則都不會發生回滾。)
- Service {
- @Transactional
- void methodA() {
- methodB();
- }
- void methodB(){
- }
- }
2:如下圖,我們調 service.methodA(), methodB上面的事務是不生效(其他的幾個註解也不會生效)。可以簡單的這麼理解:spring 無法找到methodB 這個切面,無法收到事務通知。具體解釋見下面的部落格:http://blog.csdn.net/seelye/article/details/40144817
- Service {
- void methodA() {
- methodB();
- }
- @Transactional
- void methodB(){
- }
- }
3:正常的話,我們兩個方法都定義事務的話,就要把這兩個方法放在不同的service裡面。如下面:
可以把方法B放到另外一個service或者dao,然後把這個server或者dao通過@Autowired注入到方法A的bean裡面,這樣即使方法A沒用事務,方法B也可以執行自己的事務了。AOP就是這麼玩的!
- ServiceA {
- void methodA() {
- ServiceB.methodB();
- }
- }
- ServiceB {
- void methodB() {
- }
- }
4:
Spring中事務的定義:
Propagation
(key屬性確定代理應該給哪個方法增加事務行為。這樣的屬性最重要的部份是傳播行為。)有以下選項可供使用:
PROPAGATION_REQUIRED--支援當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
PROPAGATION_SUPPORTS--支援當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY--支援當前事務,如果當前沒有事務,就丟擲異常。
PROPAGATION_REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER--以非事務方式執行,如果當前存在事務,則丟擲異常。