Spring Класс @Transactional против правил приоритета метода

Spring говорит abuot @Transactional

Самое производное местоположение имеет приоритет при оценке параметров транзакции для метода.

Означает ли это, что аннотация по методу полностью отменяет аннотацию из класса или не опущены ли атрибуты (так по умолчанию)?

например.

@Transactional(isolation=Isolation.SERIALIZABLE)
public class MyService {

    @Transactional(readOnly=true)
    public void method() {
       ...
    }
}

Итак, каковы настройки изоляции метода? Является ли это Isolation.DEFAULT, потому что это значение по умолчанию, поэтому оно неявно переопределяет Isolation.SERIALIZABLE или оно Isolation.SERIALIZABLE, потому что ни один из них не был явно указан в аннотации метода?

Ответ 1

Аннотации на уровне метода полностью перекрывают аннотацию на уровне уровня. Здесь нет никакой иерархии. Позвольте мне объяснить немного больше. Невозможно узнать, было ли задано значение для конкретного атрибута, или если значение default возвращается, когда вы читаете атрибуты аннотации. Таким образом, Spring или кто-либо еще не может определить, был ли переопределен конкретный атрибут или используется значение по умолчанию. Таким образом, нет способа принять решение, основанное на наличии или отсутствии атрибута. По этой причине всякий раз, когда вы переопределяете любую аннотацию (то есть укажите ее с более тонкой детализацией), вам нужно указать все необходимые атрибуты. Итак, в вашем случае Isolation.DEFAULT будет применяться isolation.

Однако, как и в стороне, предположим, что у вас есть ваша собственная аннотация, которая указывает пустую строку как значение по умолчанию для некоторого атрибута. В этом случае, если в аннотации на уровне класса указывается непустая строка для этого атрибута, а аннотация на уровне метода не указывает никакого значения (таким образом, используя значение по умолчанию: пустая строка), вы можете сделать вывод о том, что значение атрибута из аннотации на уровне класса должно использоваться. То есть, не позволяя значение по умолчанию в аннотации уровня метода переопределить указанное пользователем значение на уровне класса. В любом таком сценарии вы должны быть уверены, что значение по умолчанию не соответствует допустимому значению атрибута. В случае аннотаций @Transactional Isolation.DEFAULT действительно представляет допустимое значение и может быть явно задано пользователем.