Откат весенней загрузки транзакции - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь переключиться на Spring Boot (v2.0.1.RELEASE) и EntityManager.Я потратил неделю на работу по откату базы данных MySQL в исключительных случаях, но все еще не могу понять это.

@Repository
public class HibernateDaoImp implements Dao {
    @PersistenceContext 
    private EntityManager entityManager;

    public <T extends AbstractEntity> T saveOrUpdate(T entity) {
        if(entity.getId() == null || entity.getId().equals(0)) {
            this.entityManager.persist(entity);
            t = entity;
        } else {
            t = (T) this.entityManager.merge(entity);
        }
        return t;
    } 
}

@Service("userService")
public class UserServiceImp implements UserService {
    @Autowired
    protected Dao dao;

    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {ServiceException.class})
    public User saveUser(User user) throws ServiceException {
        user = this.dao.saveOrUpdate(user);
        throw new ServiceException(500, "internal error");
    }
}

Пользователь все еще сохраняется в БД.Вот логин:

2018-05-25 10: 36: 46.297 TRACE 25041 --- [nio-8080-exec-4] .stsTransactionSynchronizationManager: Связанное значение [org.springframework.orm.jpa.EntityManagerHolder@4c6ea9e2] для ключа [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@3dd8ed71] в нить [http-nio-8080-exec-4] 2018-05-25 10: 36: 46.356 [DEBUG 25041]nio-8080-exec-4] csknected.controller.UserController: save id = null 2018-05-25 10: 36: 46.357 TRACE 25041 --- [nio-8080-exec-4] .stsTransactionSynchronizationManager: Полученное значение [орг.springframework.orm.jpa.EntityManagerHolder@4c6ea9e2] для ключа [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@3dd8ed71], связанного с потоком [http-nio-8080-exec-4] 2018-05-2558: 36: 3625041 --- [nio-8080-exec-4] .stsTransactionSynchronizationManager: Связанное значение [org.springframework.jdbc.datasource.ConnectionHolder@5b4dc571] для ключа [HikariDataSource (HikariPool-1)] для потока [http-nio-80]exec-4] 2018-05-25 10:36:46.358 TRACE 25041 --- [nio-8080-exec-4] .stsTransactionSynchronizationManager: Инициализация синхронизации транзакций 2018-05-25 10: 36: 46.358 TRACE 25041 --- [nio-8080-exec-4] ostiTransactionInterceptor: Получение транзакции для[cskservice.UserServiceImp.saveUser] 2018-05-25 10: 36: 46.358 TRACE 25041 --- [nio-8080-exec-4] .stsTransactionSynchronizationManager: извлеченное значение [org.springframework.orm.jpa.EntityManagerHolder@4c6ea9e2] forключ [org.springframework.orm.jpa.адрес, код, адрес электронной почты, пароль, имя, имя, потерянное имя, фамилия, мобильный, телефон, идентификатор фото, время зарегистрировано, тип пользователя) (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, 'a') 2018-05-25 10: 36: 46.457 TRACE 25041 --- [nio-8080-exec-4] ostiTransactionInterceptor: Завершение транзакции для[cskservice.UserServiceImp.saveInvite] после исключения: cskservice.ServiceException 2018-05-25 10: 36: 46.457 TRACE 25041 --- [nio-8080-exec-4] ostiRuleBasedTransactionAttribute: применение правил для определения того, должна ли транзакция выполнять откат приcskservice.ServiceException 2018-05-25 10: 36: 46.457 TRACE 25041 --- [nio-8080-exec-4] ostiRuleBasedTransactionAttribute: Правило успешного отката: RollbackRuleAttribute с шаблоном [cskservice.ServiceException] 2018-05-25 10: 36: 46.460 TRACE 25041 --- [nio-8080-exec-4] .stsTransactionSynchronizationManager: Очистка синхронизации транзакций 2018-05-25 10: 36: 46.460 TRACE 25041 --- [nio-8080-exec-4] .stsTransactionSynchronizationManager: удалено значение [org.springframework.jdbc.datasource.ConnectionHolder@5b4dc571] для ключа [HikariDataSource (HikariPool-1)]] из потока [http-nio-8080-exec-4] 2018-05-25 10:36: 46.468 TRACE 25041 --- [nio-8080-exec-4] .stsTransactionSynchronizationManager: удаленное значение [org.springframework.orm.jpa.EntityManagerHolder@4c6ea9e2] для ключа [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@3dd8ed71] из потока [http-nio-8080-exec-4]

Я также заметил, что если я заметил, что@Transactional для Обязательного к Обязательному:

@Transactional(propagation = Propagation.MANDATORY, rollbackFor = {ServiceException.class})

Я получил следующую ошибку:

org.springframework.transaction.IllegalTransactionStateException: не найдена существующая транзакция для транзакции, отмеченной с распространением 'обязательный '

Вот мой pom:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</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-mail</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Любая помощь будет оценена!

-ZJ

Вот мои настройки источника данных в application.properties:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mytestdb?useSSL=false
spring.datasource.username=abc
spring.datasource.password=abc123

spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.maximum-pool-size=50
spring.datasource.hikari.idle-timeout=1000
spring.datasource.hikari.pool-name=knected-pool

#spring.datasource.tomcat.max-wait=20000
#spring.datasource.tomcat.max-active=50
#spring.datasource.tomcat.max-idle=20
#spring.datasource.tomcat.min-idle=15

spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.id.new_generator_mappings = false

1 Ответ

0 голосов
/ 26 мая 2018

После сужения до базового соединения, основанного на предложении @ Kayaman, я обнаружил, что Springboot 2.0 @Transaction не поддерживается org.hibernate.dialect.MySQL5Dialect .Я перешел на MySQL5InnoDBDialect и пересоздал таблицы, и откат работает, как и ожидалось!

Прежде всего я должен опубликовать свою конфигурацию источника данных.

Большое спасибо @Kayaman и @Sundararaj Govindasamy за вашу помощь!

...