Принцип транзакций Spring полностью проанализирован

Spring

Что такое бизнес? Вы понимаете, как работают транзакции? Говоря о принципе транзакций Spring, можете ли вы реализовать принцип транзакций Spring самостоятельно? Есть ли у вас знания, чтобы сначала проверить себя? Тогда давайте посмотрим на дела, связанные с Весной

концепция

Транзакции имеют свойства ACID.

Относится к ряду операций, выполняемых как единая логическая единица работы, либо полностью, либо не выполняемых вовсе.

Нижний уровень транзакции Spring опирается на транзакцию MySQL, которая реализована с использованием АОП на уровне кода. Транзакции MySQL имеют концепцию уровня изоляции, транзакции есть только у InnoDB, а метод реализации заключается в использовании журнала отмены и журнала повтора.

С точки зрения АОП есть точки соединения, точки, улучшения, цели, переплетения. Ссылаться наНачало работы с Spring АОП, Spring использует TransactionInceptor для перехвата и обработки транзакций при выполнении транзакций на уровне кода.

Системный анализ Основная статья о транзакциях Spring:

код

  1. В AopConfigUtils вы можете увидеть, какой тип AutoProxyCreator будет сгенерирован.beanPostProcessor, чтобы выполнить пользовательскую обработку экземпляра компонента после его создания. Если используется @EnableTransactionManagement, после некоторой настройки будет создан InfrastructureAdvisorAutoProxyCreator. Как создать этот класс, можно щелкнуть в @EnableTransactionManagement.

EnableTransactionManagement
-> @Import(TransactionManagementConfigurationSelector.class)
-> return new String[] {AutoProxyRegistrar.class.getName(),
						ProxyTransactionManagementConfiguration.class.getName()};
-> AutoProxyRegistrar.registerBeanDefinitions中
-> 创建InfrastructureAdvisorAutoProxyCreator

  1. В жизненном цикле Бина завершено создание Бина и вызов для создания метода InfrastructureAdvisorAutoProxyCreator.postProcessAfterInitialization.

    Кроме того, стоит обратить внимание на метод AbstractAutowireCapableBeanFactory.initializeBean.

    Получите совет бина, если есть совет (расширенный), создайте динамический прокси для бина. Создание динамических прокси выполняется Spring AOP. В соответствии с настройками создаются динамические прокси JDK и прокси CGLib. По умолчанию в нашем проекте используются динамические прокси CGLib (proxyTargetClass=true), только динамические прокси CGlib, в основном класс усилителя

Вот использование EnhacerКак использовать Cglib (1) -- Enhancer

Перехват интерфейса перехвата (прокси объекта, метод метода, Object[] args, MethodProxy methodProxy) имеет данные, которые мы хотим перехватить в соответствии с условиями, о которых можно судить по параметрам.

  1. Вы можете следить за методом DefaultAdvisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice.

    PointcutAdvisor为BeanFactoryTransactionAttributeSourceAdvisor
    MethodMatcher为TransactionAttributeSourcePointcut
    

Полученный перехватчик является перехватчиком транзакций.Поскольку это перехватчик транзакций, он может не отставать от предыдущего анализа.

Анализ принципа транзакций Spring

  1. Давайте посмотрим, почему полученный перехватчик — это MethodInterceptor. В MethodMatcher.match есть AdvisorAdapter

И Advice находится в советнике, советник BeanFactoryTransactionAttributeSourceAdvisor

  • TransactionIntercetor по умолчанию в TransactionProxyFactoryBean

  • В аннотации по умолчанию @EnableTransactionManagement установите совет BeanFactoryTransactionAttributeSourceAdvisor на TransactionIntercetor, Аннотация этого шага вступает в силу, как мы уже упоминали в первом шаге.

  1. Сопоставление метода Метод соответствия в TransactionAttributeSourcePointcut вызывает атрибут TransactionAttributeSource, чтобы определить, существует ли атрибут метода.

Затем вызовите calculateTransactionAttribute(method, targetClass), чтобы определить, существует ли атрибут транзакции

AbstractFallbackTransactionAttributeSource.computeTransactionAttribute
--> AnnotationTransactionAttributeSource.determineTransactionAttribute 获取方法属性
--> 获取到TransactionAttribute,然后返回
  1. Теперь мы в основном объяснили, как работает перехватчик транзакций Spring, когда перехватчик установлен и как сопоставляется метод транзакции.

Транзакция не вступает в силу

  • Частный метод не вступит в силу. JDK должен быть интерфейсом. В интерфейсе не может быть частного метода. Если используется метод защиты, он не вступит в силу. Причина в том, что spring внутренне определяет, что модификатор метода не генерирует прокси-класс перехвата транзакций, если он не является общедоступным.
  • Когда прокси-сервер CGLib, окончательный метод не будет работать, вызовите NullPointException, cglib и внутренний механизм JDK.

Последнее — почему нетранзакционный метод вызывает транзакционный метод в текущем компоненте, почему он не действует?

public int save(String name, int age) throws Exception {
        insert(name, age);
        return 1;
    }
    @Transactional
    public void insert(String name, int age){
        jdbcTemplate.update("insert into user(id,name,age)values(1,'"+name+"',"+age+")");
        jdbcTemplate.update("insert into user(id,name,age)values(2,'"+name+"',"+age+")");
        jdbcTemplate.update("insert into user(id,name,age)values(1,'"+name+"',"+age+")");
    }

отвечать:

После окончательной проверки делаются следующие выводы:

Если сначала вызывается метод сохранения, то при перехвате метода перехватчик метода сначала получает исходный объект, проксируемый текущим динамически проксируемым объектом.

Например, имя динамического прокси, сгенерированного FirstApp, — FirstApp$CGlibxxx, а объект, полученный через getTarget в это время, — это экземпляр FirstApp.

Затем, если установлено, что текущий метод, такой как метод сохранения, не имеет рекомендаций (расширенных), метод исходного объекта вызывается напрямую, то есть в это время вызывается метод FirstApp.save. Вместо метода сохранения FirstApp$CGLibxxx. Может следовать коду.

Наконец

Весенние дела, если вы внимательно прочитаете статью, которую я написал, я верю, что вы многое приобретете

Ссылаться на