我使用第三方框架通过将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();
}
但是,应向筛选器添加异常处理。