Java @事务需要回滚除数据库中的一个存储之外的所有内容

Java @事务需要回滚除数据库中的一个存储之外的所有内容,java,exception,rollback,java-annotations,Java,Exception,Rollback,Java Annotations,我有一个方法: @Transactional @Override public void createFile(final String number) { try { //code to save values throw new Exception(number); } catch(Exception e){ this.repository.save(e.getMessage()); }

我有一个方法:

@Transactional
@Override
public void createFile(final String number) {
    try {
           //code to save values
           throw new Exception(number);
        } catch(Exception e){
             this.repository.save(e.getMessage());
     }
}
在方法createFile中,有许多数据库保存操作需要在发生错误时回滚。Catch需要将错误消息保存在表中


在异常情况下如何回滚整个事务,但仍然保存/更新this.repository.save(e.getMessage());在数据库上?有人能帮我解决这个问题吗?提前感谢。

我假设您正在使用Spring

将其分为两种方法。例如,
createFile
带有调用另一个的try-catch,例如,
createFileWorker
带有
//保存值的代码。从
createFile
调用
createFileWorker
。如果这两个方法在同一个类中,例如,
MyService
,则必须使用
@Lazy
将代理的
MyService
注入
MyService
,并且必须通过此代理的Lazy实例调用
createFileWorker
createFileWorker
应该用
@Transactional(传播=传播。需要\u NEW)
注释


防止自调用/代理问题的好方法,但2个服务仍然可以!?那不是黑客。您也可以使用非构造函数自动连接,但拥有两个服务将是更糟糕的解决方案。@wilx,谢谢您的解决方案。我试过了。但我还是无法挽救。它正在倒退
@Service
class MyService {

private MyService self;

public MyService(@Lazy MyService self) {
  this.self = self;
}

@Transactional
void createFile() {
  try {
    self.createFileWorker()
  } catch (Exception ex) {
    this.repository.save(e.getMessage());
  }
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
void createFileWorker() {
  //code to save values
}

}