我有一个服务类,从数据库加载一些实体,修改它们的某些值,然后(当所有操作合法)将这些更改提交到数据库。如果新值是无效的(只能在设置后检查),我不想保存更改。为了防止Spring/Hibernate保存更改,我在方法中抛出异常。但这会导致以下错误:
Could not commit JPA transaction: Transaction marked as rollbackOnly
以下是该服务的内容:
@Service
class MyService {
@Transactional(rollbackFor = MyCustomException.class)
public void doSth() throws MyCustomException {
//load entities from database
//modify some of their values
//check if they are valid
if(invalid) { //if they arent valid, throw an exception
throw new MyCustomException();
}
}
}
这是我调用它的方式:
class ServiceUser {
@Autowired
private MyService myService;
public void method() {
try {
myService.doSth();
} catch (MyCustomException e) {
// ...
}
}
}
预期发生的情况:数据库没有任何更改,用户也看不到异常。
实际发生的情况:数据库没有任何更改,但应用程序崩溃并出现以下错误:
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction;
nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
虽然已经正确将事务设置为rollbackOnly状态,但为什么回滚操作会引发异常呢?
@Transactional
注释中,尝试使用noRollbackFor
而不是rollbackFor
。 - papacito@Transactional
注释。删除后它完美地工作了。您能否将您的评论发布为答案(并可能简要解释为什么不应该是事务性的)? - user3346601