在Spring bean中访问Db时线程安全

时间:2015-06-04 00:34:45

标签: java spring concurrency thread-safety double-checked-locking

我有弹簧支架控制器调用的单件弹簧服务。

单件服务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);
            }
        }
    }
}

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

1 个答案:

答案 0 :(得分:2)

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