Прежде чем говорить об управлении весенними транзакциями, давайте подумаем о том, как мы выполняем операции данных в Hibernate, когда мы не используем Spring. В Hibernate мы должны сначала запустить транзакцию, затем выполнить операции данных, затем отправить транзакцию и закрыть транзакцию. Причина, по которой мы делаем это, заключается в том, что автоматический коммит транзакции Hibernate по умолчанию является ложным, что требует от нас вручную отправить транзакцию. Если вы не хотите вручную отправлять транзакцию каждый раз, вы можете установить ее для автоматического совершения транзакции в моем файле hibernate.cfg.xml:
XML -код
<name = "defaultautocommit"> <value> false </value> </property>
Несмотря на то, что мы устанавливаем его метод совершения транзакций для автоматического, он может выполнять операции с данными, это не соответствует нашим фактическим потребностям бизнеса, потому что иногда после того, как я сохраняю одну данных, я надеюсь, что он может продолжать сохранять другие данные. Я надеюсь совершить транзакцию вместе после сохранения двух или более данных. Таким образом, даже если есть ошибка, мы можем отказаться и обеспечить согласованность данных. Либо успех, либо неудача. В настоящее время мы не можем автоматически совершать транзакцию после сохранения одного данных, потому что они не находятся в одной и той же транзакции, и мы не можем гарантировать согласованность данных. Таким образом, в настоящее время нам нужно вручную настройку наших транзакций, что требует использования механизма управления транзакциями, предоставленного Spring для Hibernate. Управление транзакциями, предоставленное весной, можно разделить на две категории: программные и декларативные. Программирование фактически контролируется в коде. Точно так же, как Hibernate управляет данными, он запускает транзакции и представляет транзакции. Этот метод имеет определенные ограничения, поэтому мы обычно используем декларатив для настройки наших транзакций.
Декларативная конфигурация транзакции в основном делится на следующие шаги:
1. Декларативная конфигурация транзакции
(1) настроить диспетчер транзакций;
(2) характеристики распространения транзакции;
(3) Эти классы и методы используют транзакции.
<!-- Configure the sessionFactory that the transaction manager specifies its function and hand over the transaction to Spring for processing --> <bean id="transactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> <!-- Configure the propagation characteristics of transactions --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx: атрибуты> <tx: method name = "save*" opragation = "требуется"/> <tx: method name = "delete*" opragation = "требуется"/> <tx: method name = "update*" Propagation = "требуется"/> <tx: method name = "get*" not name = "not_supported". read-only = "true"/> </tx: атрибуты> </tx: консультант> <!-Какие методы этих классов участвуют в транзакциях-> <aop: config> <aop: pointcut id = "allServiceMethod" Expression = "Exepring (*com.coe.service.*(..)"/> <aop: Advisor pointcut-refice. Advice-ref = "txadvice"/> </aop: config>
При настройке транзакций мы обычно устанавливаем границу транзакции на уровень обслуживания, то есть ваш бизнес -логический уровень, потому что мы часто завершаем некоторые из наших столбцов операций данных на нашем уровне бизнес -логики. Если помещен в уровень данных DAO, гранулярность слишком мала. Кроме того, если мы настраиваем транзакции на уровне бизнес -логики, это также будет полезно для нашего вторичного кэша, который вы найдете в будущем, когда вы фактически будете его управлять.
2. Напишите методы бизнес -логики
В настоящее время мы можем использовать методы работы данных, представленные в HibernateTemplate, чтобы написать наши методы бизнес -логики на нашем уровне бизнес -логики. Конечно, наш метод должен быть таким же, как и в нашей конфигурации транзакции, используя сохранение, удаление, обновление и получение как начало нашего метода. Следует отметить, что по умолчанию исключение среды выполнения только откатится (включая унаследование подкласса Runtimeexception), и обычные исключения не будут катиться.
Наконец, давайте суммируем несколько характеристик распространения транзакций:
1. Propagation_Required: Если существует транзакция, поддерживается текущая транзакция. Если транзакция не будет, она будет включена;
2. Propagation_Supports: Если существует транзакция, текущая транзакция поддерживается. Если транзакции нет, выполнение не транзакций;
3. Propagation_Mandatory: Если транзакция уже существует, текущая транзакция поддерживается. Если нет активной транзакции, исключение брошено;
4. Propagation_Requires_New: Всегда открывайте новую транзакцию. Если транзакция уже существует, существующая транзакция приостановлена;
5. Propagation_not_supported: всегда выполнять не транзакционно и приостановить любую существующую транзакцию;
6. Propagation_Never: всегда выполняется не транзакционно, если существует активная транзакция, исключение брошено;
7. Propagation_nested: Если существует активная транзакция, она работает в вложенной транзакции. Если нет активной транзакции, выполните ее в соответствии с свойством TransactionDefinition.Propagation_Required.
Благодаря этой статье я надеюсь, что это поможет вам понять интегрированное управление транзакциями Spring и Hibernate. Спасибо за поддержку этого сайта!