做了一段B/S开发了,编程知识增长了不少,可是,感觉很多理论的东西还不是很清楚:1.页面的上的一个方法对应一个后台的服务,当多个浏览器同时操作时即同时调用后台的服务时,服务器是如何处理的?比如是完全并发的还是其他的方式?2.对数据库的操作:同时打开两个页面,对同一个记录,一个进行删除操作,一个进行修改操作(修改分为:查询、更新两步),在查询获得记录还未进行更新操作的时候,该记录被删除了,这种情况会不会发生,如果会的话如何防止?非常感谢!

解决方案 »

  1.   

    1.并发是宏观的 根本上是进程的互斥来实现的
    2.有可能发生 在进行更新操作之前先根据主键判断该记录是否存在 是则update否则insert
      

  2.   

    谢谢两位的回答!不过,我还是有些不太明白!1中,后台的一个服务(即后台的一个方法),实现时实际上不需要用多线程处理,就能满足多个用户同时访问了,我是不明白多个用户同时访问这个服务时是如何处理的?(这个处理不是指的程序本身,因为程序里不需要特殊处理就能支持多个用户同时访问,我是指多个用户同时访问这个服务时发生了什么)2中,假设两个方法:一个删除方法deleteRecord,一个修改方法,修改包括两步,描述如下:
    function void deleteRecord(){
        delete();//只有一步
    }function void modifyRecord(){
        if(queryRecord()){//先查询看看该记录是否存在
             modify();//如果存在则进行修改
         }
    }我指的是有两个页面,在一个页面执行了if(queryRecord())并且返回true但未执行modify()时,在另一个页面执行了deleteRecord()。这个情况会不会存在,如何防止。谢谢!
      

  3.   

    2 存在,无需防止,也无法防止,更新调用的是update,没更新到而已,根据update返回的结果来判断如果是hibernate记得会抛出异常,提示update了0条数据,你拦截他即可,其他的应该没什么特殊要求
      

  4.   

    谢谢各位的回答!经过Landor2004大虾的回答,我对2已经了解,消除以前编程中的顾虑,非常感谢!但是,对于1我还不是太明白!1.我想知道多个用户同时登录,然后调用同一个服务的时候发生了什么?huhk 所说的:不同用户登录就在不同的线程中,运行服务也是在他的线程中。如果用到共享资源要实现互斥。 数据库可以设定脏数据是如何读取的,就是两个人同时操作同一个数据。有几种方式是不同的。可不可以理解成:每个用户登录的时候,无须在代码里进行特殊操作,服务器本身会为登录用户启动一个线程,这个线程负责处理该用户的请求?而在数据库里设定脏数据的读取也是用来实现这些线程之间数据的一致性?谢谢!
      

  5.   

    1.我理解的是一个请求一个独立的响应,就是和你想得一样啦b( ̄▽ ̄)d
    2.加锁.啥乐观锁,悲观琐的,hibernate似乎是默认乐观锁.
      

  6.   

    1、服务器同一实例的servlet多线程进行处理。
    2、数据库加锁。