有兩個方法m1()和m2(),m1()調用了m2
public void m1() {
doSth();
m2();
}
1. m1有事物,m2也有事物
1.1 m2的propagation=Propagation.REQUIRES_NEW
m2将開啟一個新事物,運作在自己的新事物中,與m1點事物是不同的事物,如果m2報錯,則m2復原,m1是否復原,要看m2報的是哪種類型的錯誤,如果是運作時異常且異常未被吃掉(catch住),則m1也復原,如果不是運作時異常m1不復原。
m1中可以通過noRollbackFor={XXX.class}指定事物的復原規則,指定哪些異常不復原。
1.2 m2的propagation=Propagation.REQUIRED
m1和m2運作在m1的事物中。
2.m1無事物, m2有事物
如果m2報錯,則m2復原,m1的代碼是否執行成功,要看m2報的是哪種類型的錯誤,如果是運作時異常且異常未被吃掉(catch住),則m1的代碼不會執行成功,如果不是運作時異常m1會執行成功。