【发布时间】:2014-03-03 23:22:39
【问题描述】:
好的,我刚刚意识到这个问题。
假设您使用 Java + Tomcat 构建您的 Web 应用程序。
Tomcat 同时收到来自 2 个客户端的 2 个调用。第一次调用(将调用一系列方法并返回一个整数)在第二次之前被服务器接收。
呼叫1:
String passwordProvidedByUser=action.getPasswordFromClient();
String passwordFromDB=data.getPasswordFromDB();
if (passwordFromDB.equals(passwordProvidedByUser)){
boolean updated=data.updateInfo();
}
呼叫 2:
String newPassword=action.getPasswordFromClient();
boolean changePwd=data.changePwd(newPassword);
因此,如果 Call1 完成了 String passwordFromDB=data.getPasswordFromDB(); 但尚未运行 boolean updated=data.updateInfo(); 而 call 2 已运行 boolean changePwd=data.changePwd(newPassword);。也就是说用旧密码拨打 1 boolean updated=data.updateInfo();?
我的问题是,Tomcat 服务器/Java 会在开始处理第二次调用之前完成第一次调用的所有操作并将结果返回给第一次调用吗?
或者 Tomcat 服务器/Java 刚刚开始处理第二个,而它仍在处理第一个(即服务器尚未向第一个返回结果,但已经开始处理第二个)?
【问题讨论】:
-
ur?这是什么……我的空间? -
1) 你提供的用例永远不会被实现。 2)如果它会,比是的,乐观锁定。总而言之,提供串行但仍然并发的请求处理并不是一种常见的做法。您正在尝试实现一些其他人可能不需要的东西。至于银行系统中的乐观锁定——OFC。这是处理单个实体的并发修改的常用方法。如果您仍然看到问题,您将不得不为分布式应用程序发明自己的标准,因为 Java EE、ASP.NET 或更常见的 PHP 解决方案都适合您。恕我直言。