我有一个弹簧支撑控制器正在调用的单例弹簧服务。

单例服务MyService具有某些方法addRecordIfNotExistsBefore,该方法具有以下实现:

public void addRecordIfNotExistsBefore(String record){

    boolean isExist = checkIfRecordNotExitsBefore();

    if (!isExist){
        addRecordToDb(record);
    }
}


问题是-如所显示的-当两个客户端同时请求相同的服务时,则将记录两次添加到数据库中。

我可以在一些简单的实现中应用double-check idiom,例如:

public void addRecordIfNotExistsBefore(String record){

    boolean isExist = checkIfRecordNotExitsBefore();

    if (!isExist){
        synchoronized(this){

            isExist = checkIfRecordNotExitsBefore();
            if (!isExist){
                addRecordToDb(record);
            }
        }
    }
}


它是有效的解决方案,还是还有其他更好的解决方案?

最佳答案

我认为唯一的解决方案是使用数据库约束来检查应用程序部署在多节点中的数据库场景中记录的唯一性

关于java - 在Spring bean中访问Db时的线程安全,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30633099/

10-12 18:33