Java 如果POST响应无法传递,如何回滚事务
使用SpringMVC,假设我实现了一个控制器,该控制器处理POST请求,在事务中执行数据库操作,并在响应体中返回结果 以下是控制器和服务层:Java 如果POST响应无法传递,如何回滚事务,java,spring,spring-mvc,transactions,spring-transactions,Java,Spring,Spring Mvc,Transactions,Spring Transactions,使用SpringMVC,假设我实现了一个控制器,该控制器处理POST请求,在事务中执行数据库操作,并在响应体中返回结果 以下是控制器和服务层: @RestController @RequiredArgsConstructor public class SomeController { private final SomeService someService; @PostMapping("/something") public SomeResult postSomething(S
@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协议不包含检测这种情况的内部过程,所以操作系统使用诸如超时之类的启发式方法 所以我在这里只看到一个选择。Spring尝试将响应写入套接字,但响应太大,无法放入缓冲区。在这种情况下,写入操作将被阻止。然后在一段时间后,它将因超时而中断,并引发异常 我不能100%确定我的答案是否准确,所以你最好自己检查一下。 我建议您不要依赖这种机制,因为它取决于许多不同的因素,如缓冲区大小、超时和Spring实现 2) 对于Spring,答案将是否
3) 这取决于你。没有普遍的答案。例如,可以将
Hibernate
配置为对对象使用版本控制。谢谢!你能澄清一下第一个问题吗?如果在服务呼叫结束后但在响应完全发送回客户机之前拔出网线,Spring是否会引发异常?我扩展了我的答案。