繁体   English   中英

简单 Java 服务中的并发问题

[英]Concurrency issue in a simple Java service

  1. 在下面的 Java ToolHireService 中,我如何以最佳方式防止同一工具被多个客户端雇用的并发问题。 当同一工具被评估以供租用时,它应该只“阻塞线程”。

  2. 关于如何编写失败的测试的任何指示?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM