[英]Concurrency issue in a simple Java service
在下面的 Java ToolHireService 中,我如何以最佳方式防止同一工具被多个客户端雇用的并发问题。 当同一工具被评估以供租用时,它应该只“阻塞线程”。
关于如何编写失败的测试的任何指示?
public class ToolHireService {
public int toolHire(Client client , String toolId , Date startDate , Date endDate){
Tool tool = getToolFromDB(toolId);
if(tool == null || tool.isHired()){
return -1;
}
ToolHireEntry toolEntry = new ToolHireEntry(tool,startDate,endDate);
client.addHireHistory(toolEntry);
client.save();
tool.setHired(true);
return tool.save();
}
}
PS:只要使用不同的工具,预订应该能够不间断地进行。
答案一如既往,视情况而定。
您是否在多个客户端使用的一个进程中有一个 ToolHireInstance? 在这种情况下,简单地同步整个方法就足够了。
您是否在多个客户端使用的一个进程中有多个 ToolHireInstances? 在这种情况下,您可以在 ToolHireService.class 对象上进行同步,这将创建一个所有实例都将用于同步的对象。
您是否有多个 ToolHireInstances 分布在多个进程中,每个进程都有客户端(并且您的数据库有一个 JDBC 连接器)? 在这种情况下,您可能希望通过使整个方法存在于 SQL 事务中来将事务部分推入 JDBC。 这需要重新组织您的代码以公开事务元素。 您需要决定执行此原子 pull_tool->evaluate_status->save_hiring_decision 所需的 SQL 隔离级别。
您是否有多个 ToolHireInstance 分布在多个进程中,每个进程都有客户端(并且没有JDBC 连接器)? 请咨询您的数据库,了解存在哪些类型的事务方法。 如果不存在,您将需要使用某种其他类型的外部同步工具。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.