1 Spring里面,如果一個方法,存在多個切面,是按照切面的Order順序來執(zhí)行的:Order值越小,那么切面越先執(zhí)行(越后結(jié)束).
2 @Transactional的Order值是Integer.MAX_VALUE.
3 如果不指定Order,那么Order是默認值->Integer.MAX_VALUE. 如果Order相同,則是按照切面字母的順序來執(zhí)行切面.
比如@Transactional和@Cacheable->對應(yīng)的切面是TransactionInterceptor和CacheInterceptor,則先執(zhí)行@Cacheable的切面.
4 一般將事務(wù)切面放到最貼近方法的那一層,即事務(wù)最后執(zhí)行(最先結(jié)束),避免其他切面吃掉原本方法的異常,導(dǎo)致事務(wù)執(zhí)行結(jié)果不符合預(yù)期.
5 事務(wù)的傳遞分為單機項目和微服務(wù)項目.
單機項目,A方法有事務(wù),A調(diào)用B方法,B方法加不加注解,都會在A的事務(wù)里.
如果A方法沒事務(wù),B方法有事務(wù),分兩種情況,在同一個類,B事務(wù)不生效,在不同的類B事務(wù)生效,A無事務(wù);
微服務(wù)項目,事務(wù)無法傳遞,只能在異常情況,進行代碼異澄シ回滾,盡可能保持事務(wù)一致.