我在A处有个方法
@Transactional
public void doSomething() {
for (int i = 0; i < 100; i++) {
anotherService.doThing();
}
}
服务B中的另一种方法
@Transactional(propagation = REQUIRES_NEW, noRollbackFor = RuntimeException.class)
public void doThing() {
...
try {
repository.insertRandomValue();
} catch (Exception ignored) {
}
...
}
我的问题是,例如,当“repository.insertRandomValue()”抛出ConstraintViolationException时,即使它在catch()中被捕获,线程也以
org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only
我尝试将传播设置为REQUIRES\u NEW,并尝试将transaction manager和GlobalRollbackOnParticipationFailure设置为false。
@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager manager = new JpaTransactionManager(entityManagerFactory);
manager.setGlobalRollbackOnParticipationFailure(false);
return manager;
}
我希望它只是忽略失败的插入攻击并继续工作。有人知道如何做到这一点吗?
Hibernate留档非常清楚您必须回滚(第5.16节异常处理):
如果JPA EntityManager或特定于Hibernate的会话抛出异常,包括任何JDBC SQLException,您必须立即回滚数据库事务并关闭当前的EntityManager或会话。
JPA EntityManager或Hibernate会话的某些方法不会使持久性上下文处于一致状态。根据经验,Hibernate抛出的任何异常都不能被视为可恢复的。通过在最终块中调用end()方法来确保会话将被关闭。
回滚数据库事务不会将业务对象恢复到事务开始时的状态。这意味着数据库状态和业务对象将不同步。通常,这不是问题,因为异常是不可恢复的,无论如何,在回滚后都必须重新开始。
因此,您需要事先检查是否存在ConstraintViolationException
我正在应用程序中使用Windows Azure SQL Server,当我连接到应用程序时,它显示以下错误。 hibernate.cfg.xml: .................. http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/cont
我在使用Hibernate实现的事务服务层中具有以下方法: 可以看到,在< code > else if(user account . is expired())块中,我想先删除< code>userAccount,然后抛出一个异常。但是由于它抛出了一个异常,并突然退出该方法,所以没有执行delete。 我想知道是否有任何方法可以在抛出异常时坚持删除操作。
我试图通过集成Struts 2来创建一个注册页面 Hibernate配置文件: Hibernate映射文件:
我们已经安装了Tomcat7.0。好心帮帮忙!!!
我在Spring-MVC+JPA上有应用。我建立战争并尝试在Tomcat上开始。 DataConfig: app.properties为: 因此,tomcat日志中会出现错误消息: