Что такое бизнес? Вы понимаете, как работают транзакции? Говоря о принципе транзакций Spring, можете ли вы реализовать принцип транзакций Spring самостоятельно? Есть ли у вас знания, чтобы сначала проверить себя? Тогда давайте посмотрим на дела, связанные с Весной
концепция
Транзакции имеют свойства ACID.
Относится к ряду операций, выполняемых как единая логическая единица работы, либо полностью, либо не выполняемых вовсе.
Нижний уровень транзакции Spring опирается на транзакцию MySQL, которая реализована с использованием АОП на уровне кода. Транзакции MySQL имеют концепцию уровня изоляции, транзакции есть только у InnoDB, а метод реализации заключается в использовании журнала отмены и журнала повтора.
С точки зрения АОП есть точки соединения, точки, улучшения, цели, переплетения. Ссылаться наНачало работы с Spring АОП, Spring использует TransactionInceptor для перехвата и обработки транзакций при выполнении транзакций на уровне кода.
Системный анализ Основная статья о транзакциях Spring:
- Начало работы с Spring АОП
- Улучшения Spring AOP (советы)
- Жизненный цикл Spring Bean
- Принцип реализации Spring АОП
- Принцип весенней транзакции
код
- В AopConfigUtils вы можете увидеть, какой тип AutoProxyCreator будет сгенерирован.beanPostProcessor, чтобы выполнить пользовательскую обработку экземпляра компонента после его создания. Если используется @EnableTransactionManagement, после некоторой настройки будет создан InfrastructureAdvisorAutoProxyCreator. Как создать этот класс, можно щелкнуть в @EnableTransactionManagement.
EnableTransactionManagement
-> @Import(TransactionManagementConfigurationSelector.class)
-> return new String[] {AutoProxyRegistrar.class.getName(),
ProxyTransactionManagementConfiguration.class.getName()};
-> AutoProxyRegistrar.registerBeanDefinitions中
-> 创建InfrastructureAdvisorAutoProxyCreator
-
В жизненном цикле Бина завершено создание Бина и вызов для создания метода InfrastructureAdvisorAutoProxyCreator.postProcessAfterInitialization.
Кроме того, стоит обратить внимание на метод AbstractAutowireCapableBeanFactory.initializeBean.
Получите совет бина, если есть совет (расширенный), создайте динамический прокси для бина. Создание динамических прокси выполняется Spring AOP. В соответствии с настройками создаются динамические прокси JDK и прокси CGLib. По умолчанию в нашем проекте используются динамические прокси CGLib (proxyTargetClass=true), только динамические прокси CGlib, в основном класс усилителя
Вот использование EnhacerКак использовать Cglib (1) -- Enhancer
Перехват интерфейса перехвата (прокси объекта, метод метода, Object[] args, MethodProxy methodProxy) имеет данные, которые мы хотим перехватить в соответствии с условиями, о которых можно судить по параметрам.
-
Вы можете следить за методом DefaultAdvisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice.
PointcutAdvisor为BeanFactoryTransactionAttributeSourceAdvisor MethodMatcher为TransactionAttributeSourcePointcut
Полученный перехватчик является перехватчиком транзакций.Поскольку это перехватчик транзакций, он может не отставать от предыдущего анализа.
Анализ принципа транзакций Spring
- Давайте посмотрим, почему полученный перехватчик — это MethodInterceptor. В MethodMatcher.match есть AdvisorAdapter
И Advice находится в советнике, советник BeanFactoryTransactionAttributeSourceAdvisor
- TransactionIntercetor по умолчанию в TransactionProxyFactoryBean
- В аннотации по умолчанию @EnableTransactionManagement установите совет BeanFactoryTransactionAttributeSourceAdvisor на TransactionIntercetor, Аннотация этого шага вступает в силу, как мы уже упоминали в первом шаге.
- Сопоставление метода Метод соответствия в TransactionAttributeSourcePointcut вызывает атрибут TransactionAttributeSource, чтобы определить, существует ли атрибут метода.
Затем вызовите calculateTransactionAttribute(method, targetClass), чтобы определить, существует ли атрибут транзакции
AbstractFallbackTransactionAttributeSource.computeTransactionAttribute
--> AnnotationTransactionAttributeSource.determineTransactionAttribute 获取方法属性
--> 获取到TransactionAttribute,然后返回
- Теперь мы в основном объяснили, как работает перехватчик транзакций 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. Может следовать коду.
Наконец
Весенние дела, если вы внимательно прочитаете статью, которую я написал, я верю, что вы многое приобретете