如果无法传递POST响应,如何回滚事务

时间:2017-07-04 14:07:18

标签: java spring spring-mvc transactions spring-transactions

使用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 个答案:

答案 0 :(得分:2)

我会尝试回答你的问题:

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

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

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

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

2)使用Spring答案将

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