我尝试切换到Spring (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");
}
}用户仍然保存在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更改为强制性的:
@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发布于 2018-05-26 15:04:57
在根据@Kayaman的建议缩小到底层连接之后,我发现了Springboot 2.0 @Transaction doesn't get supported by org.hibernate.dialect.MySQL5Dialect。我更改为MySQL5InnoDBDialect并重新创建了表,而回滚就像预期的那样工作!
首先,我应该发布我的数据源配置。
感谢“Kayaman”和“Sundararaj”,感谢您的帮助!
https://stackoverflow.com/questions/50534913
复制相似问题