我有一个班级:
@Service
@Transactional
class MyService{
@Autowired MyTableRepository repository;
@Autowired FacebookMessageSender sender;
public void updateTableAndSendMessage(MyTable m){
m.setProcessed(1);
repository.save(m);
sender.sendMessageToFacebook(m);
}
}
代码中的某处:
List<MyTable> list=repository.findByProcessed(0);
for(MyTable m:list){
myService.process(m);
}
所以,我有以下内容: 在石英作业中,我检索处理标志设置为0的所有记录。然后我将其传递给服务,然后处理标志变为1并且系统将消息发送到Facebook messenger(无论在哪里)。但是,如果发生sql异常,在'process'方法执行之前或之后,事务将被回滚并且标志将仍为0.因此Facebook消息将在下次作业启动时发送,并且一次又一次。我试图将其分解为2种方法,一种是保存标志其他发送消息。但是,如果没有发送消息,我将不得不回滚该事务呢?所以这就像死锁一样。我需要阻止FB消息在其他异常上发送,并且在FB发送失败时回滚DB更改。如何在spring-data中执行此操作,afaik事务将在方法结束后提交。感谢