如果无法传递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
可以配置为在对象上使用版本控制。