1. Механизм транзакции пружины
Все технологии доступа к данным имеют механизмы обработки транзакций, которые предоставляют API для включения транзакций, совершения транзакций для завершения операций данных или отката от данных, когда возникает ошибка.
Механизм транзакций Spring использует унифицированный механизм для обработки транзакций различных технологий доступа к данным. Механизм транзакций Spring обеспечивает интерфейс PlatformTransactionManager, а транзакции различных технологий доступа к данным реализованы с использованием различных интерфейсов:
Код для определения менеджера транзакций в программе выглядит следующим образом:
@Bean Public PlatformTransactionManager TransactionManager () {JPatransActionManager TransactionManager = new JPatransActionManager (); TransactionManager.setDatasource (dataSource ()); return TransactionManager; }2. декларативные транзакции
Spring поддерживает декларативные транзакции, то есть использование аннотаций для выбора метода, который необходимо использовать транзакции. Он использует @Transactional Annotation, чтобы указать на метод, который метод требует поддержки транзакций.
@Transactional public void saveSomething (Long Id, String name) {// Операция базы данных}Здесь важно отметить, что эта @transactional Annotation происходит от Org.springframework.transaction.annotation, а не javax.transaction.
Spring обеспечивает аннотацию @enabletrancactionManagement, чтобы обеспечить поддержку декларативной транзакции в классах конфигурации. После использования @enabletransactionmanagemange, пружинный контейнер автоматически сканирует методы и классы, аннотированные @transactional. @EnabletransactionManagement используется следующим образом:
@Configuration @enabletransactionmanagement открытый класс appconfig {}3. Используйте @Transactional на уровне класса
@Transactional может не только аннотировать методы, но и на занятиях. При аннотировании на классе это означает, что все публичные методы этого класса активируются транзакциями. Если уровень класса и уровень метода использует @transactional Annotation на уровне класса, аннотация уровня метода будет перегружена с помощью уровня класса.
4. Поддержка транзакций для данных Spring JPA
Данные Spring JPA обеспечивает поддержку транзакций для всех методов по умолчанию, а свойство Readonly = True включено по умолчанию для транзакций запроса.
Это можно увидеть из исходного кода SimpleJparePository, который SimpleJparePository определяет @TransActional (readonly = true) на уровне класса, в то время как свойство @Transactional перезаписывается в операциях, связанных с сохранением и удалением. В настоящее время свойство Readonly является ложным, а другие операции запросов Readonly по -прежнему ложны.
5. Поддержка транзакции Spring Boot
1. Автоматически настроенный диспетчер транзакций
При использовании JDBC в качестве технологии доступа к данным Springboot определяет бобы платформы ThransactionManager для нас. См. Определение в org.springframework.boot.autoconfigure.jdbc.datasourcetransactionmanagerautoconfiguration класс:
@Bean @conditionalonmissingbean @conditionalonbean (dataSource.class) publicTransactionManageManager TransactionManager () {return New DataSourCetransActionManager (this.DataSource); }При использовании JPA в качестве технологии доступа к данным Spring Boot определяет бобы для реализации PlatformTransactionManager JPatransActionManager; См. Определение в org.springframework.boot.autoconfigure.orm.jpa.jpabaseconfiguration.class class:
@Bean @conditionalonmissingbean (platformtransactionmanager.class) public platformtransactionManager TransactionManager () {return new JPatransactionManager (); } 2. Автоматическое включение поддержки аннотационных транзакций
Spring Boot специально используется для настройки транзакций как org.springframework.boot.autoconfigure.transaction.transactionAutoConfiguration. Этот класс конфигурации зависит от jpabaseconfiguration и dataSourCetransActionManagerautoConfiguration.
Поддержка декларативных транзакций также включена в конфигурации DataSourCetransActionManagerautoConfiguration, код выглядит следующим образом:
@Conditionalonmissingbean (AbstractTransActionManagementConfiguration.Class) @Configuration @enableTransActionManagement Защищенный статический класс TransactionManagementConfiguration {}Таким образом, в Spring Boot нет необходимости отображать включенную аннотацию @enabletrancactionManagement.
6. Пример (Springboot)
1.pom.xml:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
2. Application.yml:
Сервер: порт: 5000 Spring: DataSource: Driver-Class-Name: com.mysql.jdbc.driver Show-SQL: True
3. Персонал класса сущности:
@Entity public class heplect {@id @generatedvalue private long id; Приватное название строки; частный целый возраст; частный строковый адрес; Public Sffect () {super (); } Public Maff (Long Id, название строки, целое число, строковое адрес) {super (); this.id = id; this.name = name; this.age = возраст; this.address = адрес; } // Опустите методы получения и установки}4. Репозиторий персонала:
Public Interface StaffRepository расширяет jParePository <Персонал, long> {}5. Сервисный интерфейс:
Public Interface Staffservice {Public SaveStaffWithRollback (персонал); // Rollingback Public SavestaffWithoutrollback (персонал); // Не откатываться}6. Реализация услуг:
@Service Public Class StaffServiceImpl реализует Staffservice {@autowired staffrepository staffrepository; // Вы можете непосредственно ввести бобы нашего RersonRepository. @Override // Используйте атрибут @Transactional Annotation @TransactionAl, чтобы указать конкретное исключение, данные будут откатаются. @Transactional (rollbackfor = {allosalargumentException.class}) Общественный персонал Savestaffwithrollback (персонал) {Персонал S = staffRepository.save (персонал); if (feff.getName (). equals ("zhang san")) {бросить новый allosalargumentException ("Zhang San уже существует, откат"); } return s; } @Override Public Maff SavestaffWithoutrollback (персонал) {Персонал s = staffRepository.save (персонал); if (feff.getName (). equals ("zhang san")) {бросить новый allosalargumentException ("Zhang San уже существует, данные не откатываются"); } return s; }}7. Контроллер:
@RestController @Requestmapping ("/feffse") public class staffcontroller {@autowired hepservice efffectservice; // проверить ситуацию с откатом @Requestmapping ("/roplack") Обратный обратный обратный обратник (персонал) {return staffservice.savestaffwithrollback (персонал); } // Проверка ситуации с откатом @RequestMapping ("/notrollback") Public Maff Norollback (персонал) {return healsservice.savestaffwithoutrollback (персонал); }}8. Запустите тест:
(1) Откат: http: // localhost: 5000/half/hollback? Имя = Zhang San & Age = 18
Консоль:
База данных:
(2) Без отката: http: // localhost: 5000/holep/notrollback? Name = Zhang San & Age = 18
Консоль:
База данных:
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.