使用 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 不是幂等的)。
Thanks!
我将尝试回答你的问题:
1) Maybe。这取决于答案的大小和连接丢失的确切时刻。
如果当 spring 尝试向套接字操作系统写入响应时检测到 TCP/IP 连接已关闭,则会抛出异常。 TCP 协议不包含检测这种情况的内部程序,因此操作系统使用超时等启发式方法。
所以我在这里只看到一种选择。 Spring 尝试将响应写入套接字,但响应太大而无法放入缓冲区。在这种情况下写操作将被阻止。然后一段时间后,它将因超时而中断并引发异常。
我不能100%确定我的答案准确,所以你最好自己检查一下。
我建议你不要依赖这种机制,因为它取决于许多不同的因素,如缓冲区大小、超时和 Spring 实现。
2)Spring的答案将是NO.
3)这取决于你。没有普遍的答案。例如Hibernate
可以配置为在对象上使用版本控制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)