Java UnitOfWork模式如何帮助解决并发问题?

Java UnitOfWork模式如何帮助解决并发问题?,java,hibernate,persistence,unit-of-work,Java,Hibernate,Persistence,Unit Of Work,我从Martin Fowler的名著中读到了关于工作单元的企业设计模式,我有几个问题: 作者说这种模式需要: 1.避免冗余的数据库通信(很明显) 2.解决并发问题 问题: 实际上,我不明白这种模式如何帮助解决并发问题。你能解释一下吗 我应该为每个实体类或每个实体对象或每个应用程序的单实例创建UoW实例吗 UoW一书中的一个例子如下: class UnitOfWork .... private List newObjects = new ArrayList(); private

我从Martin Fowler的名著中读到了关于工作单元的企业设计模式,我有几个问题:

作者说这种模式需要:
1.避免冗余的数据库通信(很明显)
2.解决并发问题

问题:
  • 实际上,我不明白这种模式如何帮助解决并发问题。你能解释一下吗

  • 我应该为每个实体类或每个实体对象或每个应用程序的单实例创建UoW实例吗

  • UoW一书中的一个例子如下:

    class UnitOfWork ....
    
        private List newObjects = new ArrayList();
        private List dirtyObjects = new ArrayList();
        private List removedObjects = new ArrayList();
    
    
        public void registerNew(DomainObject o){...}
        public void registerDirty(DomainObject o){...}
        public void registerRemoved(DomainObject o){...}
        public void registerClean(DomainObject o){...}
    
    这里看起来像是单个UoW负责一些对象集

    但在另一个例子中:

    class UnitOfWorkServlet ...
       final protected void doGet(HttpServletRequest request,HttpServletResponse response){
          try{
             UnitOfWork.newCurrent(); // create UnitOfWorkInstance in ThreadLocal
             handleGet(request, response);
             UnitOfWork.getCurrent().commit() 
          } finally(){
             UnitOfWork.setCurrent(null) //threadLocalInstance.set(null)
          }
       }
    
    在这里,我们为每个Get请求创建新的UoW实例,看起来每个请求都与另一个请求隔离开来。它如何解决并发问题

    假设我们有两个相关实体:客户和订单。我们应该创建两个不同的UnitOfWork实例,还是在两个实体中都使用单个实例


    作者声明我们必须将UoF实例存储在ThreadLocal中以避免灾难,但我不明白为什么。他在说什么

    假设我们有两个来自UI的不同的同时请求,但它们都更新了数据库中的客户端字段。你能解释一下这些请求的行为吗?应创建多少UoF工作以及它们如何解决并发问题

    附笔。 我主要是在java方面有经验的,所以如果你的答案能够解释基于JPA/Hibernate的事情,对我来说是可以的