Java阻止对Spring MVC中的方法的并发访问

时间:2016-06-10 11:48:44

标签: java hibernate spring-mvc

我想使用Spring MVC在表中添加一些虚拟数据。

以下是代码: -

在Dao

    public int generateData(){
    int iData = 80001;
    String qry = "SELECT p FROM TestDomain p";
    List<TestDomain> runQry = daoHelper.findByQuery(qry);
    if(runQry.size()!=0){
        TestDomain tdom = runQry.get((runQry.size()-1));
        iData = tdom.getNum_data();
        iData++;
    }


    return iData;
}

这将生成一个虚拟值,以添加到表中的整数列。基本上如果表是空的,它会生成80001,如果不是,则增加现有的最大值。请注意,由于某些要求限制,我无法使列唯一。从上面的函数中获取数据后,我只需使用merge函数将其插入表中。

 entityManager.merge(entity);

现在的问题是,当多个用户同时点击生成功能时,会为它们分配相同的数据,这会在数据被不同的客户端推送到表时导致重复。如何防止这种重复?

编辑..

1,我已经在我的generate方法上尝试了java synchronized关键字但它不起作用,可能是因为我在服务层使用了spring的事务。

2,我无法使用数据库序列生成唯一数据,数据必须来自generate方法。

2 个答案:

答案 0 :(得分:1)

它不是Spring MVC数据重复问题的问题。您的应用程序需要通过控制对生成id(或)首选方法的方法的并发访问来防止数据重复,即使用数据库序列来获取下一个id,而不是生成id的应用程序。

如果你不能使用数据库序列并且仍然想使用generate方法那么你的应用程序需要通过添加JAVA synchronized 关键字来生成方法来控制并发性(和/或)锁定任何object允许单线程访问该方法。这将使其他用户/线程等待,直到执行此方法。

答案 1 :(得分:1)

在hibernate中查看@Version注释。它可能会解决您的问题。

或者,您可以做的是在执行操作时使用悲观锁定并锁定表格。