首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring事务回滚

Spring事务回滚
EN

Stack Overflow用户
提问于 2018-05-25 18:23:43
回答 1查看 5.5K关注 0票数 1

我尝试切换到Spring (v2.0.1.RELEASE)和EntityManager。我花了一周的时间来处理异常的MySQL数据库回滚,但仍然无法弄清楚。

代码语言:javascript
复制
@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");
    }
}

用户仍然保存在DB中。下面是这张照片:

2018-05-25 10:36:46.297跟踪25041 - nio-8080-exec-4 .s.t.s.TransactionSynchronizationManager :键org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@3dd8ed71的绑定值.s.t.s.TransactionSynchronizationManager到线程http-nio-8080-exec-4 2018-05-25 10:36:46.356调试25041 -- nio-8080-exec-4 c.s.knected.controller.UserController :保存id=null 2018-05-25 10:36:46.357跟踪25041 -- nio-8080-exec-4 .s.t.s.TransactionSynchronizationManager :键org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@3dd8ed71绑定到线程http-nio-8080-exec-4 2018-05-25的检索值org.springframework.jdbc.datasource.ConnectionHolder@5b4dc571 :36:46.358跟踪25041 - nio-8080-exec-4 .s.t.s.TransactionSynchronizationManager :键绑定值org.springframework.jdbc.datasource.ConnectionHolder@5b4dc571HikariDataSource (HikariPool-1)到线程http-nio-8080-exec-4 2018-05-25 10:36:46.358跟踪25041 - nio-8080-exec-4 .s.t.s.TransactionSynchronizationManager :初始化事务同步2018-05-25 10:36:46.358跟踪25041 - nio-8080-exec-4 o.s.t.i.TransactionInterceptor :获取c.s.k.service.UserServiceImp.saveUser 2018-05-25 10:36:46.358跟踪25041 - nio-8080-exec-4 .s.t.s.TransactionSynchronizationManager :绑定到线程http-nio-8080-exec-4 Hibernate的密钥org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@3dd8ed71的检索值.s.t.s.TransactionSynchronizationManager:插入用户(created_by,time_created,删除,deleted_by,time_deleted,name,time_updated,updated_by,adress,代码,电子邮件,密码,first_name,lost_login,last_name,移动电话,photo_id,time_registered,user_type)值(?,?)值( ?,2018-05-25 10:36:46.457痕量25041 - nio-8080-exec-4 o.s.t.i.TransactionInterceptor:在异常后完成c.s.k.service.UserServiceImp.saveInvite事务处理: 2018-05-25 10:36:46.457痕量25041 - nio-8080-exec-4 o.s.t.i.RuleBasedTransactionAttribute :应用规则确定事务是否应该在c.s.k.service.ServiceException 2018-05-25 10:36:46.457 TRACE 25041??nio-8080-exec-4 o.s.t.i.RuleBasedTransactionAttribute:赢回回滚规则上回滚: RollbackRuleAttribute具有模式o.s.t.i.RuleBasedTransactionAttribute-05-25:36:46.460跟踪25041 - nio-8080-exec-4 .s.t.s.TransactionSynchronizationManager :清除事务同步2018-05-2510:36:46.460痕量25041 - nio-8080-exec-4 .s.t.s.TransactionSynchronizationManager : key HikariDataSource (HikariPool-1)的移除值.s.t.s.TransactionSynchronizationManager (HikariPool-1),线程http-nio-8080-exec-42018-05-25 10:36:46.468 TRACE 25041 -NiO-NiO-8080-EXEC-4.s.t.s.TransactionSynchronizationManager:关键org.springframework的删除值org.springframework.orm.jpa.EntityManagerHolder@4c6ea9e2。来自线程http-nio-8080-exec-4的orm.jpa.LocalContainerEntityManagerFactoryBean@3dd8ed71

我还注意到,如果我将@Transactional更改为强制性的:

代码语言:javascript
复制
@Transactional(propagation = Propagation.MANDATORY, rollbackFor = {ServiceException.class})

我得到了以下错误:

org.springframework.transaction.IllegalTransactionStateException:没有为标记为传播“强制”的事务找到现有事务

以下是我的pom:

代码语言:javascript
复制
<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中的数据源设置:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-26 15:04:57

在根据@Kayaman的建议缩小到底层连接之后,我发现了Springboot 2.0 @Transaction doesn't get supported by org.hibernate.dialect.MySQL5Dialect。我更改为MySQL5InnoDBDialect并重新创建了表,而回滚就像预期的那样工作!

首先,我应该发布我的数据源配置。

感谢“Kayaman”和“Sundararaj”,感谢您的帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50534913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档