1. Примеры сценариев использования
Прежде чем мы поймем, как используется @Transactional, мы должны сначала знать, что полезно @Transactional. Позвольте мне дать вам большие пальцы: например, в отделе есть много участников, и эти двое хранятся в таблице отделов и таблице участников соответственно. При удалении определенного отдела, предположим, что мы удаляем соответствующих участников по умолчанию. Однако это может произойти во время исполнения. Сначала мы удаляем отдел, а затем удаляем членов. Тем не менее, департамент успешно удалил его, и при удалении участников произошло исключение. В настоящее время мы надеемся, что если удаление участника не удастся, ранее удаленный отдел также отменит удаление. Этот сценарий может быть откат назад, используя @transactional вещей.
2. Проверено исключение и неконтролируемое исключение
Причина, по которой мы даем всем знать концепции проверенных исключений и неконтролируемых исключений, заключается в том, что:
Spring использует декларативную обработку транзакций. По умолчанию, если в методе эксплуатации базы данных происходит неверное исключение, все операции базы данных будут откатами; Если исключение происходит зарегистрированным исключением, операции базы данных по -прежнему будут представлены по умолчанию.
Проверено исключение:
Недействительный, не предсказуемый в программе. Например, неверный пользовательский ввод, файл не существует, ошибки ссылки на сеть или базы данных. Это все внешние причины и не контролируются программой.
Должен быть обработан явно в коде. Например, обработка блоков Try-Catch или выбросьте исключение из предыдущего слоя стека вызовов с описанием бросков.
Унаследован от java.lang.xpression (кроме java.lang.runtimeexception).
Незаконное исключение:
Указывает ошибку, логика программы неверна. Это подкласс runtimeexception, такой как allodalargumentException, nullpointerexception и allodalstateException.
Нет необходимости явно улавливать неконтролируемые исключения в коде для обработки.
Унаследован от java.lang.runtimeexception (и java.lang.runtimeexception наследует от java.lang.exception).
Глядя на диаграмму ненормальной структуры ниже, она может быть более многослойной:
3. Пример использования @Transactional
В этом примере используется Eclipse+Maven. Мэвен управляется только банкой, и даже друзья обезьяны Мавен, которые не понимают, могут понять это.
3.1. Файл конфигурации пружины
Пространство имен TX должно быть настроено сначала следующим образом:
Для использования @транзакционных транзакций требуется следующая конфигурация в пружине:
<bean id = "apptransactionManager"> <name = "dataSource" ref = "dataSource" /> < /bean> <tx: аннотационная прокси-target-class = "false" transaction-manager = "AppTransactionManager" />>>>
Весь файл конфигурации блоггера:
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: context = "http://www.springframework.org/schema/context" xmlns: tx = "http://www.springframework.org/schema/tx" xmlns: aop = "http://www.springframe.orshema. xsi: schemalocation = "http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.spramework.org/schema/Bem http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xm.spramework.org/schema/context/spring-3.0.spramework.org/schema/context-context-3.0.spramework.org/schema/context/spring-3.0. Файл конфигурации JDBC-> <bean id = "PropertyConfigurer"> <name = "locations"> <Sist> <datule> classpath: свойства/*. Свойства </value> <!-Если есть несколько файлов конфигурации, просто продолжайте добавлять их здесь-> </properation> </bean> <!-Конфигурация данных-> <Bean Id ID = "! <!-Настроить свойства-> <!-Настроить свойства-> <!-<name = "driverclassname" value = "com.mysql.jdbc.driver" /> <name = "url" value = "jdbc: mysql: // localhost: 3306 /useman" /> <name = "username" = root " /root" /"root" /"root" /" /" root " /" root " /" root " /" root " /" /"root" /"root" /"root" /"root" /"root". value = "Christmas258@"/>-> <!-Используйте свойства для настройки-> <name = "driverclassname"> <dalue> $ {jdbc_driverclassname} </value> </property> <property name = "url"> <value> $ {jdbc_url} </value> </property> <property> <property name = "usersame usemane"> "usersame"> " <dulch> $ {jdbc_username} </value> </property> <name = "password"> <value> $ {jdbc_password} </value> </properation> </bean> <bean id = " proxy-target-class = "false" transaction-manager = "apptransactionmanager" /> <!-автоматически сканировать все файлы интерфейса Mapper, соответствующие xxxxmapper.xml, так что вам не нужно вручную настраивать отображение mpper один за другим. Пока класс интерфейса Mapper и файл отображения Mapper соответствуют друг другу. -> <Bean> <name = name = "basePackage" value = "com.luo.dao" /> < /bean> <!-Настройка файла mybatis, настройка Mapperlocations ** Mapper.xml File местоположение, Configlocation configure mybatis-config file местоположение "dataSce namece name-dataSce namese" = name-dataSce name-dataSce "=" dataSce dataSce name-dataSce namece namo <name = "mapperlocations" value = "classpath: mapper/*. xml"/> <name = "configlocation" value = "classpath: mybatis/mybatis-config.xml"/> <!-<property name = "typealiasespackage" value = "com.tiantian.ckeditor.model"/> </bean> </bean> </bean> </bean> </bean> </bean> </bean antoTitor Бобы-> <Контекст: компонент-сканирование Base-package = "com.luo.service" /> < /beans>3.2. Используйте @transactional для добавления аннотаций в метод класса реализации пользователя
@Transactional (Propagation = Propagation.Required) public void AddUser (пользователь пользователя) {userDao.adduser (пользователь); String string = null; if (string.equals ("")) {int i = 0; }}В приведенном выше методе я намеренно сделал его исключение из нулевого указателя, и все будет отказываться
3.3. Запустите класс модульного тестирования
@Test public void adduserTest () {user user = new user (); user.setusername ("luoguohui1"); user.setuserPassword ("luoguohui1"); userservice.adduser (пользователь);}Я обнаружил, что его нельзя вставить, но если @Transactional удален, код выглядит следующим образом. Хотя происходит исключение, в базу данных все еще есть соответствующие данные:
3.4. Скачать исходный код
Загрузите окончательный исходный код этой статьи: First_maven_project_jb51.rar
4. Концепции, что @Transactional весной должен быть понят
@Transactional в пружине основан на динамическом прокси -механизме и обеспечивает прозрачный механизм управления транзакциями для облегчения и быстрого решения проблем, возникающих при разработке.
Как правило, это следует комментировать методы, интерфейсы или классы через следующий код:
@Transactional (распространение = распространение. Not_supported)
Распространение поддерживает 7 различных механизмов распространения:
Требуется: если существует транзакция, текущая транзакция поддерживается. Если транзакции нет, начинается новая транзакция.
Поддержки: если существует транзакция, текущая транзакция поддерживается. Если транзакции нет, выполнение не транзакции. Однако для управляющих транзакциями транзакций транзакции пропагандистские операции немного отличаются от не использования транзакций.
Not_Supported: всегда выполнять не транзакционно и приостановить любую существующую транзакцию.
Требуется, всегда начинайте новую транзакцию. Если транзакция уже существует, существующая транзакция приостановлена.
Обязательно: если транзакция уже существует, поддерживайте текущую транзакцию. Если нет активной транзакции, исключение брошено.
Никогда: всегда выполнять не транзакционную, если существует активная транзакция, исключение брошено
Вложенные: если существует активная транзакция, она работает в вложенной транзакции. Если нет активной транзакции, нажмите требуемое свойство для выполнения.
Вот некоторые вещи, которые следует отметить, которые должны быть прочитаны, в противном случае, если вы столкнетесь с различными ловушками, блогер не напомнил вам:
Вот некоторые вещи, которые следует отметить, которые должны быть прочитаны, в противном случае, если вы столкнетесь с различными ловушками, блогер не напомнил вам:
Вот некоторые вещи, которые следует отметить, которые должны быть прочитаны, в противном случае, если вы столкнетесь с различными ловушками, блогер не напомнил вам:
Добавьте @transactional Annotation, где требуется управление транзакциями. @Transactional аннотации могут применяться к определениям интерфейса и методам интерфейса, определениям классов и публичным методам классов.
@Transactional аннотации могут применяться только к методам с общественной видимостью. Если вы используете @transactional Annotation на защищенных, частных или видимых пакетных методах, она не сообщит об ошибке, но этот аннотированный метод не будет отображать настроенные настройки транзакции.
Обратите внимание, что возникновения @transactional Annotation недостаточно для обеспечения поведения транзакций, это просто своего рода метаданные. Элемент конфигурации должен использоваться в файле конфигурации, чтобы действительно включить поведение транзакций.
Управляет, создается ли прокси на основе интерфейса или прокси на основе класса с помощью значения атрибута «прокси-таргета» элемента. Если «значение жанра» класса «прокси-таргета» установлено на «true», то прокси, основанный на классе, будет работать (это необходимо для cglib.jar в классе). Если значение жанра «прокси-таргета» установлено на «false» или это свойство опущено, то стандартный прокси на основе интерфейса JDK будет работать.
Весенняя команда рекомендует использовать @transactional Annotation на конкретных классах (или методах классов), а не на любых интерфейсах, которые класс хочет реализовать. Использование @transactional Annotation на интерфейсе вступит в силу только при настройке прокси на основе интерфейса. Поскольку аннотации не могут быть унаследованы, это означает, что если используется прокси на основе класса, настройки транзакции не будут распознаваться по прокси-серверу на основе класса, а объект не будет обернут прокси транзакции.
Транзакция @транзакции включена, создается либо прокси на основе интерфейса, либо прокси на основе класса. Таким образом, в том же классе один метод вызывает другой метод с транзакциями, транзакция не будет работать.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.