[英]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.