Spring @Transactional 會被繼承

最近有個子系統發生問題, 在一段 code 如下:
@Service
public class UserService extends BaseService<User, Long, UserDao> {
    public void doSomething() {
        doSomething1();
        doSomething2();
    }
}
大家都認為 doSomething() 是沒有 transaction 的, 所以 doSomething1(), doSomething2() 應該是分成不同的 transaction. 但實際狀況卻不是這樣子. 後來發現… 原來 BaseService 本身就有加上 @Transactional, 如下:
@Transactional(readOnly = true)
public abstract class BaseService<T, ID extends Serializable, R extends JpaRepository<T, ID>> {
    ...
}
而且 org.springframework.transaction.annotation.Transactional 有加上 @Inherited, 所以是可以被繼承的:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
    ...
}
所以預設所以有 BaseService 和它的 sub-class 的 public method都是有 transaction 的. 所以就可以解釋一些當時系統發生的問題.