如果无法传递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会抛出exception吗?

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

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

谢谢!

我会尽力回答你的问题:

1) 也许吧 。 它取决于答案的大小和连接丢失的确切时刻。

如果spring尝试写入对套接字OS的响应时检测到TCP / IP连接已关闭,则抛出exception。 TCP协议不包含内部检测程序这种情况,因此OS使用启发式方法如超时。

所以我在这里只看到一个选项。 Spring尝试编写对socket的响应,但响应太大而无法适应缓冲区。 在这种情况下,写操作将被阻止。 然后经过一段时间后会因为超时而中断并引发exception。

我不是100%确定我的答案是准确的,所以你最好自己检查一下。 我建议你不要依赖这个机制,因为它依赖于许多不同的因素,如缓冲区大小,超时和Spring实现。

2)spring的回答是否定的

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