JPA транзакция не откатывает постоянный вызов.Вставляет и фиксирует игнорирование транзакционных правил только на MySQL - PullRequest
0 голосов
/ 23 октября 2018

У меня есть @Transactional(rollbackFor=Exception.class) аннотация для моего метода с использованием общего ресурса Spring EntityManager.Но когда я намеренно устанавливаю имя пользователя в дубликат, транзакция не откатывает постоянный вызов.Оригинальное уникальное имя пользователя все еще фиксируется в БД.Постоянный вызов действует так, как будто у него есть свои правила совершения.Я могу выбрать это значение в консоли MySQL немедленно после того, как эта строка выполняется в режиме отладки.Что, вероятно, означает, что оно автоматически передается.В журнале SQL указывается оператор вставки прямо при выполнении строки, а оператор удаления не выполняется при откате.Откат работает полностью, как и ожидалось, в базе данных H2 в памяти.

  • У меня было spring.jpa.open-in-view=false
  • Я попытался использовать em.find и изменить значение, а затем выдать исключение.Модификация правильно откатилась.Таким образом, проблема заключается только в постоянном вызове
  • Я попытался распространить REQUIRE REQUIRE_NEW, но бесполезно
  • пользователь базы данных, используемый для подключения, имеет надлежащую привилегию

    @PersistenceContext
    EntityManager em;
    
    @Transactional(rollbackFor = Exception.class)
    public User save(User user) {
        em.persist(user);
        user.setUsername("duplicate"); // this will throw an exception upon flushing the change
        return user;
    }
    

Как мне остановить это поведение и заставить фиксированный вызов зафиксировать все остальное?

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.11</version>
    </dependency>

Обновление : вручную с помощью throw new Exception или call em.flush () с нарушением целостности также не вызывает отката.Откат происходит, но не удаляет вставленную запись.

2018-10-23 00:26:36.909 DEBUG 5475 --- [nio-8080-exec-1] o.s.orm.jpa.JpaTransactionManager        : Initiating transaction rollback
2018-10-23 00:26:36.913 DEBUG 5475 --- [nio-8080-exec-1] o.s.orm.jpa.JpaTransactionManager        : Rolling back JPA transaction on EntityManager [SessionImpl(PersistenceContext[entityKeys=[EntityKey[com.crawlers.main.models.User#85]],collectionKeys=[]];ActionQueue[insertions=ExecutableList{size=0} updates=ExecutableList{size=0} deletions=ExecutableList{size=0} orphanRemovals=ExecutableList{size=0} collectionCreations=ExecutableList{size=0} collectionRemovals=ExecutableList{size=0} collectionUpdates=ExecutableList{size=0} collectionQueuedOps=ExecutableList{size=0} unresolvedInsertDependencies=null])]

Нет решения на Аннотация @Transactional.Как откатиться? у меня работает.Перепробовал все решения и комментарии: (

1 Ответ

0 голосов
/ 23 октября 2018

Решено.Смотрите комментарий.Мои таблицы были поддержаны MyISAM, и он не поддерживает откат.Каждый запрос выполняется индивидуально, и постоянный вызов фиксируется сразу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...