JPA事务不会回滚持久调用。仅在MySQL上插入和提交,忽略事务规则

时间:2018-10-22 21:31:06

标签: java spring jpa

我使用Spring共享的@Transactional(rollbackFor=Exception.class)在方法上有一个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>

更新: 手动抛出new Exception或调用完整性违规的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])]

Annotation @Transactional. How to rollback?的解决方案对我没有用。尝试了所有解决方案和评论:(

1 个答案:

答案 0 :(得分:1)

已解决。见评论。我的表由MyISAM支持,它不支持回滚。每个查询单独运行,并且持久调用立即提交。