Java Servlet 在提交数据库事务之前向客户端返回响应



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

public class MyServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        startTransaction();
        framework.process(req, resp);
        commitTransaction();
    }
}

事实证明,框架在调用 commitTransaction() 返回之前将完整的响应写回客户端。这会产生可能的争用条件:客户端可能会发出在第二个新数据库事务中运行的后续请求,该事务无法访问在第一个事务中添加或更新的数据,因为它尚未提交。

解决此类问题的最佳做法是什么?我无法修改正在使用的框架的行为。

我建议使用ServletFilter来解决此类问题。它看起来像这样:

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

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

最新更新