如果无法传递POST响应,如何回滚事务


问题内容

使用Spring MVC,假设我已经实现了一个控制器,该控制器处理POST请求,在事务内部执行数据库操作,然后在响应主体中返回结果。

这是控制器和服务层:

@RestController
@RequiredArgsConstructor
public class SomeController {

  private final SomeService someService;

  @PostMapping("/something")
  public SomeResult postSomething(Something something) {
    return someService.handle(something);
  }

}

@Service
@RequiredArgsConstructor
public class SomeService {

  private final SomeRepository someRepository;

  @Transactional
  public SomeResult handle(Something something){
    // changes to the database
  }

}

问题:

假设 有人 在服务呼叫后立即 拉网线 ,则事务开始。

1)如果响应无法传递,Spring会抛出异常吗?

2)如果无法传递响应,是否可以回滚事务?

3)当客户端重试时,如何确保数据库保持一致?(POST不是幂等的)。

谢谢!


问题答案:

我会尽力回答您的问题:

1) 也许 。这取决于答案的大小和失去连接的确切时间。

如果spring尝试向套接字OS写入响应时检测到TCP /
IP连接已关闭,则会引发异常。TCP协议不包含检测这种情况的内部过程,因此OS使用诸如超时之类的试探法。

所以我在这里只看到一种选择。Spring尝试将响应写入套接字,但是响应太大而无法容纳在缓冲区中。在这种情况下,写操作将被阻止。然后一段时间后,它将因超时而中断,并引发异常。

我不确定100%我的答案正确无误,因此您最好自己检查一下。我建议您不要依赖这种机制,因为它取决于许多不同的因素,例如缓冲区大小,超时和Spring实现。

2)对于Spring,答案将为

3)由您决定。没有普遍的答案。例如,Hibernate可以配置为在对象上使用版本控制。