Javaservlet在提交数据库事务之前将响应返回给客户机

Javaservlet在提交数据库事务之前将响应返回给客户机,java,servlets,transactions,Java,Servlets,Transactions,我使用第三方框架通过将HttpServletRequest和HttpServletResponse传递到框架中来处理我的请求。数据库事务处理与框架分开进行,如下所示: public class MyServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletExc

我使用第三方框架通过将HttpServletRequest和HttpServletResponse传递到框架中来处理我的请求。数据库事务处理与框架分开进行,如下所示:

public class MyServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {

        startTransaction();
        framework.process(req, resp);
        commitTransaction();

    }
}
public void doFilter(
        ServletRequest request,
        ServletResponse response, 
        FilterChain chain) throws IOException, ServletException {
    startTransaction();
    chain.doFilter(request, wrapper);
    commitTransaction();
 }
事实证明,在调用
commitTransaction()
返回之前,框架会将完整响应写回客户端。这会产生可能的竞争条件:客户端可能会发出一个后续请求,该请求在第二个新数据库事务中运行,该事务无法访问在第一个事务中添加或更新的数据,因为它尚未提交

解决这些问题的最佳实践是什么?我无法修改我正在使用的框架的行为。

我建议对此类问题使用。它看起来是这样的:

public class MyServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {

        startTransaction();
        framework.process(req, resp);
        commitTransaction();

    }
}
public void doFilter(
        ServletRequest request,
        ServletResponse response, 
        FilterChain chain) throws IOException, ServletException {
    startTransaction();
    chain.doFilter(request, wrapper);
    commitTransaction();
 }

但是,您应该向筛选器添加异常处理。

在framework.process中,传递一个响应包装器实例-当客户端尚未收到第一个请求的响应时,为什么要发出另一个请求?@BalajiKrishnan谢谢!这看起来很有希望@wero因为
framework.process(…)
直接写入响应。在调用服务器上的commit之前,客户端可能会收到完整长度的响应