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