should it really call B’s SessionSynchronization methods?! It should for A but not B. Transaction starts in A and finishes in A too. No need for calling B’s synch methods. I guess you’re using a side effect of how weblogic handles transactions (I guess by putting some transaction info in active thread context), so when you’re in the same jvm the info is there in the context so it blindly calls synch… methods. When you declare B to use A’s transactional state, it means B trusts in A for managing its transaction, gives B the chance to do something more that what it meant by giving A the privilege to manage the transaction. You may try using REQUIRES_NEW for B and see what happens.