使用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不是幂等的。)
谢谢!
答案 0 :(得分:2)
我会尝试回答你的问题:
1)也许。这取决于答案的大小和连接丢失的确切时刻。
如果spring尝试写入对套接字OS的响应时检测到TCP / IP连接已关闭,则抛出异常。 TCP协议不包含内部检测程序这样的情况,因此操作系统会使用超时等启发式方法。
所以我在这里只看到一个选项。 Spring尝试编写对socket的响应,但响应太大而无法适应缓冲区。在这种情况下,写操作将被阻止。然后经过一段时间后会因为超时而中断并引发异常。
我不能100%确定我的答案是准确的,所以你最好自己检查一下。 我建议你不要依赖这种机制,因为它依赖于许多不同的因素,如缓冲区大小,超时和Spring实现。
2)使用Spring答案将否。
3)由你决定。没有普遍的答案。例如,Hibernate
可以配置为在对象上使用版本控制。