在下面的 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 对象上进行同步,这将创建一个所有实例将用于同步的对象。
您是否有多个 ToolHireInstance 分布在多个进程中,每个进程都有客户端(并且您的数据库有 JDBC 连接器)?在这种情况下,您可能希望通过使整个方法存在于 SQL 事务中来将事务部分推送到 JDBC 中。这需要重新组织代码以公开事务元素。您需要决定执行此原子性 pull_tool->evaluate_status->save_hiring_decision 所需的 SQL 隔离级别。
您是否有多个 ToolHireInstance 分布在多个进程中,每个进程都有客户端(并且没有 JDBC 连接器)?请查询您的数据库以了解存在哪些类型的交易方法。如果不存在,您将需要使用其他类型的外部同步工具。
关于java - 简单Java服务中的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59975320/